กรอบเอนทิตี - ความสัมพันธ์

ในฐานข้อมูลเชิงสัมพันธ์ความสัมพันธ์คือสถานการณ์ที่มีอยู่ระหว่างตารางฐานข้อมูลเชิงสัมพันธ์ผ่านคีย์ต่างประเทศ 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 มีคุณสมบัติการนำทางของนักเรียน

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