4.1 บทนำ

การแปลงตารางฐานข้อมูลเป็นตารางปกติ ทำให้คุณสามารถวิเคราะห์ความสัมพันธ์ระหว่างตารางเหล่านี้ได้ จำนวนขององค์ประกอบที่โต้ตอบระหว่างสองตารางที่เกี่ยวข้องกันเรียกว่าจำนวนสมาชิก จำนวนนับช่วยให้คุณควบคุมประสิทธิภาพการแบ่งพาร์ติชันข้อมูลของคุณลงในตาราง

ตามทฤษฎีแล้ว เอนทิตีทั้งหมดสามารถรักษาความสัมพันธ์ซึ่งกันและกันได้ แต่ในทางปฏิบัติ ความสัมพันธ์ระหว่างเอนทิตีมีสามประเภท:

  • หนึ่งต่อหนึ่ง
  • หนึ่งต่อหลาย
  • หลายต่อหลายคน

4.2 การสื่อสารแบบตัวต่อตัว

หากมีเพียงหนึ่งตัวอย่างของเอนทิตี A สำหรับแต่ละอินสแตนซ์ของเอนทิตี B พวกเขาจะถูกกล่าวว่ามีความสัมพันธ์แบบหนึ่งต่อหนึ่ง (มักแสดงเป็น "1:1") บนไดอะแกรม ER ความสัมพันธ์ดังกล่าวจะถูกระบุด้วยเส้นที่มีแถบเล็กๆ ที่ปลายแต่ละด้าน:

โดยทั่วไป ความสัมพันธ์แบบ 1:1 บ่งชี้ว่า เว้นแต่คุณจะมีเหตุผลที่ดีในการแยกข้อมูลทั้งสองออกจากกัน ข้อมูลของตารางทั้งสองจะรวมเป็นหนึ่งเดียวได้ดีที่สุด

อย่างไรก็ตาม ในบางกรณี การใช้ตารางที่มีความสัมพันธ์แบบ 1:1 เป็นเรื่องที่สมเหตุสมผล ถ้าตารางของคุณมีฟิลด์ที่มีข้อมูลทางเลือก เช่น คำอธิบาย และในหลายกรณีว่างเปล่า คุณควรย้ายคำอธิบายทั้งหมดไปยังตารางแยกต่างหาก ซึ่งจะช่วยให้คุณสามารถกำจัดช่องว่างที่พบบ่อยและเพิ่มประสิทธิภาพของฐานข้อมูลของคุณ .

จากนั้น ในการแมปข้อมูลอย่างถูกต้อง คุณจะต้องรวมคอลัมน์ที่เหมือนกันอย่างน้อยหนึ่งคอลัมน์ในแต่ละตาราง (วิธีที่ดีที่สุดคือเลือกคีย์หลักสำหรับคอลัมน์นี้)

4.3 ความสัมพันธ์แบบหนึ่งต่อกลุ่ม

ความสัมพันธ์ประเภทนี้เกิดขึ้นเมื่อเรกคอร์ดในตารางหนึ่งเชื่อมโยงกับเอนทิตีหลายรายการในอีกตารางหนึ่ง ตัวอย่างเช่น ลูกค้ารายเดียวกันสามารถสั่งซื้อได้หลายรายการ หรือผู้เยี่ยมชมห้องสมุดสามารถยืมหนังสือหลายเล่มในการเข้าชมครั้งเดียว ความสัมพันธ์แบบหนึ่งต่อกลุ่ม (หรือเรียกสั้นๆ ว่า 1:M) จะแสดงเป็นแผนภาพโดยใช้เครื่องหมายตีนกา ดังตัวอย่างด้านล่าง:

หากต้องการใช้ความสัมพันธ์แบบ 1:M เมื่อวางแผนฐานข้อมูล เพียงเพิ่มคีย์หลักจากตาราง "หนึ่ง" เป็นแอตทริบิวต์ของตาราง "กลุ่ม" ถ้าคีย์หลักอยู่ในตารางอื่น จะเรียกว่า "คีย์ต่างประเทศ" ตาราง "หนึ่ง" ถือเป็นตารางหลัก ในขณะที่ตาราง "กลุ่ม" จะถือเป็นตารางรอง

4.4 ความสัมพันธ์แบบกลุ่มต่อกลุ่ม

เมื่อหลายเอนทิตีในตารางหนึ่งสามารถเชื่อมต่อกับหลายเอนทิตีในอีกเอนทิตีได้ จะถือว่าเอนทิตีแบบกลุ่มต่อกลุ่ม (หรือ M:M) ตัวอย่างเช่น ความสัมพันธ์ดังกล่าวมีอยู่ระหว่างนักเรียนและชั้นเรียน เนื่องจากนักเรียนแต่ละคนสามารถเข้าเรียนได้หลายชั้นเรียน ดังนั้น นักเรียนจำนวนมากจึงสามารถมาแต่ละชั้นเรียนได้

บนไดอะแกรม ER ความสัมพันธ์ชนิดนี้จะแสดงดังต่อไปนี้:

น่าเสียดาย เป็นไปไม่ได้ที่จะนำความสัมพันธ์ดังกล่าวไปใช้โดยตรงในฐานข้อมูล ดังนั้นจึงจะต้องแยกความสัมพันธ์แบบหนึ่งต่อกลุ่มออกเป็นสองความสัมพันธ์

ในการทำเช่นนี้ คุณจะต้องสร้างเอนทิตีใหม่ระหว่างสองตาราง หากมีการสร้างความสัมพันธ์แบบ M:M ระหว่างการขายและผลิตภัณฑ์ เอนทิตีใหม่สามารถเรียกว่า "ผลิตภัณฑ์ที่ขาย" เนื่องจากจะแสดงถึงเนื้อหาของการขายแต่ละครั้ง

ด้วย "สินค้าที่ขาย" และตาราง "การขาย" และตาราง "สินค้า" จะเชื่อมโยงกันด้วยประเภท 1:M ในรุ่นต่างๆ เอนทิตีระดับกลางดังกล่าวจะเรียกต่างกัน - "ตารางที่เชื่อมต่อ", "เอนทิตีที่เชื่อมโยง" หรือ "ตารางโหนด"

รายการตารางลิงก์แต่ละรายการจะเชื่อมต่อสองรายการที่แตกต่างกันของตารางที่อยู่ติดกัน (และอาจมีข้อมูลเพิ่มเติมด้วย) ตัวอย่างเช่น ตารางลิงก์ระหว่างนักเรียนและชั้นเรียนอาจมีลักษณะดังนี้:

4.5 บังคับหรือไม่?

อีกวิธีหนึ่งในการวิเคราะห์การเชื่อมโยงคือการพิจารณาว่าหน่วยงานใดที่เกี่ยวโยงกันเป็นข้อกำหนดเบื้องต้นสำหรับการมีอยู่ของหน่วยงานอื่น ด้านลิงค์เสริมถูกทำเครื่องหมายด้วยวงกลมที่ท้ายรถ

ตัวอย่างเช่น เพื่อให้รัฐมีตัวแทนของตนเองใน UN จะต้องมีอยู่ในแผนที่โลก แต่ข้อความตรงกันข้ามจะเป็นเท็จ:

หน่วยงานสองแห่งสามารถพึ่งพากันได้ (นั่นคือสิ่งหนึ่งไม่สามารถดำรงอยู่ได้หากไม่มีอีกสิ่งหนึ่ง)

ลิงก์แบบเรียกซ้ำ

บางครั้งตารางอาจหมายถึงตัวมันเอง ตัวอย่างเช่น ตารางพนักงานอาจมีแอตทริบิวต์ "ผู้จัดการ" ที่จะอ้างอิงถึงพนักงานคนอื่นในตารางเดียวกัน นี่คือความสัมพันธ์แบบเรียกซ้ำ

การเชื่อมต่อพิเศษ

ลิงก์จะถือว่าซ้ำซ้อนหากแสดงมากกว่าหนึ่งครั้ง ตามกฎแล้วหนึ่งในนั้นสามารถลบได้โดยไม่สูญเสียข้อมูลสำคัญ ตัวอย่างเช่น หากเอนทิตี "นักเรียน" เชื่อมต่อกับเอนทิตี "ครู" ไม่เพียงแต่ทางตรงเท่านั้น แต่ยังเชื่อมต่อโดยอ้อมผ่านทาง "ชั้นเรียน" อีกด้วย การลบความสัมพันธ์ระหว่างเอนทิตี "นักเรียน" และ "ครู" นั้นสมเหตุสมผล การตัดสินใจนี้ได้รับการพิสูจน์แล้วว่าสามารถมอบหมายนักเรียนให้กับครูผ่านชั้นเรียนเท่านั้น

4.6 ความสมบูรณ์ของการอ้างอิงของข้อมูล

เมื่อเปลี่ยน คีย์หลักและคีย์นอก เราควรสังเกตลักษณะเช่น Referential Integrity ของข้อมูล แนวคิดหลักคือการเก็บสองตารางในฐานข้อมูลที่เก็บข้อมูลเดียวกันให้สอดคล้องกัน

ความสมบูรณ์ของข้อมูลแสดงถึงความสัมพันธ์ที่สร้างขึ้นอย่างเหมาะสมระหว่างตารางพร้อมการเชื่อมโยงที่ถูกต้องระหว่างตารางเหล่านั้น ในกรณีใดบ้างที่สามารถละเมิดความสมบูรณ์ของข้อมูลได้:

  • ความผิดปกติในการลบ เกิดขึ้นเมื่อแถวถูกลบออกจากตารางหลัก ในกรณีนี้ foreign key จากตารางอ้างอิงยังคงอ้างถึงแถวที่ถูกลบออกจากตารางหลัก
  • ความผิดปกติของการแทรก เกิดขึ้นเมื่อแถวถูกแทรกลงในตารางที่ขึ้นต่อกัน ในกรณีนี้ foreign key จากตารางอ้างอิงไม่ตรงกับคีย์หลักของแถวใดๆ จากตารางหลัก
  • อัพเดทความผิดปกติ ด้วยความผิดปกติดังกล่าว ตารางหลายแถวอาจมีข้อมูลที่เป็นของวัตถุเดียวกัน หากคุณเปลี่ยนข้อมูลในแถวหนึ่ง ข้อมูลเหล่านั้นอาจขัดแย้งกับข้อมูลจากแถวอื่น

ความผิดปกติในการลบ

หากต้องการแก้ไขความผิดปกติในการลบ ควรตั้งค่าคีย์นอกเป็นข้อจำกัดหนึ่งในสองข้อต่อไปนี้

หากแถวจากตารางที่ขึ้นต่อกันจำเป็นต้องมีแถวจากตารางหลัก ดังนั้น foreign key จะถูกตั้งค่าเป็น cascade delete นั่นคือ เมื่อแถวถูกลบออกจากตารางหลัก แถวที่เกี่ยวข้องจะถูกลบออกจากตารางที่ขึ้นต่อกัน

ถ้าแถวจากตารางที่ขึ้นต่อกันไม่อนุญาตให้มีความสัมพันธ์กับแถวจากตารางหลัก (นั่นคือ ความสัมพันธ์ดังกล่าวเป็นทางเลือก) ดังนั้น foreign key จะถูกตั้งค่าเป็น NULL เมื่อแถวที่เกี่ยวข้องถูกลบออกจากตารางหลัก คอลัมน์คีย์นอกต้องเป็นโมฆะ

ความผิดปกติของการแทรก

เมื่อต้องการแก้ไขความผิดปกติของการแทรกเมื่อเพิ่มลงในตารางข้อมูลที่อ้างอิง คอลัมน์ที่แสดงถึงคีย์นอกต้องเป็นค่าว่าง ดังนั้น หากวัตถุที่เพิ่มไม่มีส่วนเกี่ยวข้องกับตารางหลัก คอลัมน์คีย์นอกจะมีค่าเป็น NULL

อัปเดตความผิดปกติ

ในการแก้ปัญหาความผิดปกติของการอัปเดต จะมีการใช้การทำให้เป็นมาตรฐาน ซึ่งได้กล่าวถึงก่อนหน้านี้