กรอบเอนทิตี - ความสัมพันธ์
ในฐานข้อมูลเชิงสัมพันธ์ความสัมพันธ์คือสถานการณ์ที่มีอยู่ระหว่างตารางฐานข้อมูลเชิงสัมพันธ์ผ่านคีย์ต่างประเทศ Foreign Key (FK) คือคอลัมน์หรือชุดค่าผสมของคอลัมน์ที่ใช้เพื่อสร้างและบังคับใช้การเชื่อมโยงระหว่างข้อมูลในสองตาราง แผนภาพต่อไปนี้ประกอบด้วยสามตาราง
- Student
- Course
- Enrollment
ในแผนภาพด้านบนคุณจะเห็นการเชื่อมโยง / ความสัมพันธ์ระหว่างตาราง มีความสัมพันธ์สามประเภทระหว่างตารางและความสัมพันธ์ระหว่างตารางต่างๆขึ้นอยู่กับวิธีกำหนดคอลัมน์ที่เกี่ยวข้อง
- ความสัมพันธ์แบบหนึ่งต่อกลุ่ม
- ความสัมพันธ์แบบกลุ่มต่อกลุ่ม
- ความสัมพันธ์แบบหนึ่งต่อหนึ่ง
ความสัมพันธ์แบบหนึ่งต่อกลุ่ม
ความสัมพันธ์แบบหนึ่งต่อกลุ่มเป็นประเภทของความสัมพันธ์ที่พบบ่อยที่สุด
ในความสัมพันธ์ประเภทนี้แถวในตาราง A สามารถมีแถวที่ตรงกันได้หลายแถวในตาราง B แต่แถวในตาราง B สามารถมีแถวที่ตรงกันเพียงแถวเดียวในตาราง A
คีย์ต่างประเทศถูกกำหนดไว้ในตารางที่แสดงถึงจุดสิ้นสุดของความสัมพันธ์
ตัวอย่างเช่นในแผนภาพด้านบนตารางนักเรียนและการลงทะเบียนมีความสัมพันธ์แบบเดียวกันนักเรียนแต่ละคนอาจมีการลงทะเบียนหลายครั้ง แต่การลงทะเบียนแต่ละครั้งเป็นของนักเรียนเพียงคนเดียว
ในกรอบงานเอนทิตีสามารถสร้างความสัมพันธ์เหล่านี้ด้วยรหัสได้เช่นกัน ต่อไปนี้เป็นตัวอย่างของชั้นเรียนนักเรียนและการลงทะเบียนที่เชื่อมโยงกับความสัมพันธ์แบบหนึ่งต่อหลาย
public class Student {
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
public class Enrollment {
public int EnrollmentID { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public Grade? Grade { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
}
ในโค้ดด้านบนคุณจะเห็นว่าคลาส Student มีคอลเลคชันการลงทะเบียน แต่คลาสการลงทะเบียนมี Student Object เดียว
ความสัมพันธ์แบบกลุ่มต่อกลุ่ม
ในความสัมพันธ์แบบกลุ่มต่อกลุ่มแถวในตาราง A สามารถมีแถวที่ตรงกันได้หลายแถวในตาราง B และในทางกลับกัน
คุณสามารถสร้างความสัมพันธ์ดังกล่าวได้โดยการกำหนดตารางที่สามเรียกว่าตารางทางแยกซึ่งคีย์หลักประกอบด้วยคีย์ต่างประเทศจากทั้งตาราง A และตาราง B
ตัวอย่างเช่นตารางนักเรียนและหลักสูตรมีความสัมพันธ์แบบกลุ่มต่อกลุ่มที่กำหนดโดยความสัมพันธ์แบบหนึ่งต่อกลุ่มจากแต่ละตารางเหล่านี้ไปยังตารางการลงทะเบียน
รหัสต่อไปนี้ประกอบด้วยชั้นเรียนหลักสูตรและสองชั้นเรียนข้างต้นกล่าวคือ Student และ Enrollment.
public class Course {
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CourseID { get; set; }
public string Title { get; set; }
public int Credits { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
คุณจะเห็นได้ว่าทั้งคลาสหลักสูตรและคลาสนักเรียนมีคอลเล็กชันของอ็อบเจ็กต์การลงทะเบียนซึ่งสร้างความสัมพันธ์แบบกลุ่มต่อกลุ่มผ่านการลงทะเบียนคลาสทางแยก
ความสัมพันธ์แบบหนึ่งต่อหนึ่ง
ในความสัมพันธ์แบบหนึ่งต่อหนึ่งแถวในตาราง A สามารถมีแถวที่ตรงกันได้ไม่เกินหนึ่งแถวในตาราง B และในทางกลับกัน
ความสัมพันธ์แบบหนึ่งต่อหนึ่งจะถูกสร้างขึ้นหากทั้งสองคอลัมน์ที่เกี่ยวข้องเป็นคีย์หลักหรือมีข้อ จำกัด เฉพาะ
ในความสัมพันธ์แบบหนึ่งต่อกลุ่มคีย์หลักจะทำหน้าที่เป็นคีย์ต่างประเทศเพิ่มเติมและไม่มีคอลัมน์คีย์ต่างประเทศแยกสำหรับตารางใดตารางหนึ่ง
ความสัมพันธ์ประเภทนี้ไม่เกิดขึ้นบ่อยนักเนื่องจากข้อมูลส่วนใหญ่ที่เกี่ยวข้องในลักษณะนี้จะรวมอยู่ในตารางเดียว คุณอาจใช้ความสัมพันธ์แบบหนึ่งต่อกลุ่มเพื่อ -
- แบ่งตารางที่มีหลายคอลัมน์
- แยกส่วนของตารางด้วยเหตุผลด้านความปลอดภัย
- จัดเก็บข้อมูลที่มีอายุการใช้งานสั้นและสามารถลบได้อย่างง่ายดายเพียงแค่ลบตาราง
- จัดเก็บข้อมูลที่ใช้กับส่วนย่อยของตารางหลักเท่านั้น
รหัสต่อไปนี้คือการเพิ่มชื่อชั้นอื่น StudentProfile ซึ่งมีรหัสอีเมลและรหัสผ่านของนักเรียน
public class Student {
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
public virtual StudentProfile StudentProfile { get; set; }
}
public class StudentProfile {
public StudentProfile() {}
public int ID { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public virtual Student Student { get; set; }
}
คุณสามารถดูได้ว่าคลาสเอนทิตี Student มีคุณสมบัติการนำทาง StudentProfile และ StudentProfile มีคุณสมบัติการนำทางของนักเรียน
นักเรียนแต่ละคนมีอีเมลและรหัสผ่านเพียงชุดเดียวเพื่อเข้าสู่ระบบในโดเมนของมหาวิทยาลัย ข้อมูลเหล่านี้สามารถเพิ่มลงในตารางนักเรียนได้ แต่เพื่อความปลอดภัยจะถูกแยกไปยังตารางอื่น