Khung thực thể - Mối quan hệ
Trong cơ sở dữ liệu quan hệ, mối quan hệ là một tình huống tồn tại giữa các bảng cơ sở dữ liệu quan hệ thông qua các khóa ngoại. Khóa ngoại (FK) là một cột hoặc tổ hợp các cột được sử dụng để thiết lập và thực thi liên kết giữa dữ liệu trong hai bảng. Sơ đồ sau đây chứa ba bảng.
- Student
- Course
- Enrollment
Trong sơ đồ trên, bạn có thể thấy một số loại liên kết / quan hệ giữa các bảng. Có ba loại mối quan hệ giữa các bảng và mối quan hệ giữa các bảng khác nhau phụ thuộc vào cách xác định các cột liên quan.
- Mối quan hệ một-nhiều
- Mối quan hệ nhiều-nhiều
- Mối quan hệ một-một
Mối quan hệ một-nhiều
Mối quan hệ một - nhiều là loại mối quan hệ phổ biến nhất.
Trong kiểu quan hệ này, một hàng trong bảng A có thể có nhiều hàng phù hợp trong bảng B, nhưng một hàng trong bảng B chỉ có thể có một hàng phù hợp trong bảng A.
Khóa ngoại được xác định trong bảng đại diện cho nhiều phần cuối của mối quan hệ.
Ví dụ, trong sơ đồ trên, bảng Student và Enrollment có mối quan hệ một bên, mỗi học sinh có thể có nhiều đăng ký, nhưng mỗi ghi danh chỉ thuộc về một học sinh.
Trong khuôn khổ thực thể, mối quan hệ này cũng có thể được tạo bằng mã. Sau đây là một ví dụ về các lớp Sinh viên và Ghi danh được liên kết với mối quan hệ từ một đến nhiều.
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; }
}
Trong đoạn mã trên, bạn có thể thấy rằng lớp Sinh viên chứa tập hợp các Đăng ký, nhưng lớp Đăng ký có một Đối tượng Sinh viên duy nhất.
Mối quan hệ nhiều-nhiều
Trong mối quan hệ nhiều-nhiều, một hàng trong bảng A có thể có nhiều hàng phù hợp trong bảng B và ngược lại.
Bạn có thể tạo mối quan hệ như vậy bằng cách xác định bảng thứ ba, được gọi là bảng nối, có khóa chính bao gồm các khóa ngoại từ cả bảng A và bảng B.
Ví dụ, các bảng Sinh viên và Khóa học có mối quan hệ nhiều-nhiều được xác định bởi mối quan hệ một-nhiều từ mỗi bảng này đến bảng Ghi danh.
Đoạn mã sau chứa lớp Khóa học và hai lớp trên, tức là Student và 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; }
}
Bạn có thể thấy rằng cả lớp Khóa học và lớp Sinh viên đều có tập hợp các đối tượng Đăng ký tạo mối quan hệ nhiều-nhiều thông qua Đăng ký lớp nối.
Mối quan hệ một-một
Trong mối quan hệ một đối một, một hàng trong bảng A không thể có nhiều hơn một hàng phù hợp trong bảng B và ngược lại.
Mối quan hệ một-một được tạo nếu cả hai cột liên quan đều là khóa chính hoặc có các ràng buộc duy nhất.
Trong mối quan hệ một-một, khóa chính hoạt động bổ sung như một khóa ngoại và không có cột khóa ngoại riêng biệt cho cả hai bảng.
Kiểu quan hệ này không phổ biến vì hầu hết thông tin liên quan theo cách này sẽ nằm trong một bảng. Bạn có thể sử dụng mối quan hệ 1-1 để -
- Chia một bảng có nhiều cột.
- Cô lập một phần của bảng vì lý do bảo mật.
- Lưu trữ dữ liệu tồn tại trong thời gian ngắn và có thể dễ dàng xóa bằng cách xóa bảng.
- Lưu trữ thông tin chỉ áp dụng cho một tập hợp con của bảng chính.
Đoạn mã sau là để thêm một tên lớp khác StudentProfile có chứa id email và mật khẩu của sinh viên.
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; }
}
Bạn có thể thấy rằng lớp thực thể Student chứa thuộc tính điều hướng StudentProfile và StudentProfile chứa thuộc tính điều hướng Student.
Mỗi sinh viên chỉ có một Email và mật khẩu để đăng nhập vào miền đại học. Những thông tin này có thể được thêm vào bảng Sinh viên nhưng vì lý do bảo mật mà nó được tách ra một bảng khác.