В реляционных базах данных отношения — это ситуация, которая существует между таблицами реляционных баз данных через внешние ключи. Внешний ключ (FK) — это столбец или комбинация столбцов, которая используется для установления и обеспечения связи между данными в двух таблицах. Следующая диаграмма содержит три таблицы.
- Ученик
- Курс
- регистрация
На приведенной выше диаграмме вы можете увидеть какую-то связь / связь между таблицами. Существует три типа отношений между таблицами, и отношения между различными таблицами зависят от того, как определены связанные столбцы.
- Отношения один-ко-многим
- Отношения многие ко многим
- Индивидуальные отношения
Отношения один-ко-многим
-
Отношения «один ко многим» являются наиболее распространенным типом отношений.
-
В этом типе отношений строка в таблице A может иметь много совпадающих строк в таблице B, но строка в таблице B может иметь только одну соответствующую строку в таблице A.
-
Внешний ключ определен в таблице, которая представляет собой конец множества отношений.
-
Например, на приведенной выше диаграмме таблицы «Учащийся» и «Зачисление» имеют отношение «один-ко-многим», у каждого учащегося может быть много зачислений, но каждая запись принадлежит только одному учащемуся.
Отношения «один ко многим» являются наиболее распространенным типом отношений.
В этом типе отношений строка в таблице 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 содержит коллекцию Enrollment, но класс Enrollment имеет один объект Student.
Отношения многие ко многим
В отношении «многие ко многим» строка в таблице A может иметь много совпадающих строк в таблице B, и наоборот.
-
Вы можете создать такое отношение, определив третью таблицу, называемую соединительной таблицей, первичный ключ которой состоит из внешних ключей из таблицы A и таблицы B.
-
Например, таблицы «Студент» и «Курс» имеют отношение «многие ко многим», которое определяется отношением «один ко многим» из каждой из этих таблиц с таблицей регистрации.
Вы можете создать такое отношение, определив третью таблицу, называемую соединительной таблицей, первичный ключ которой состоит из внешних ключей из таблицы A и таблицы B.
Например, таблицы «Студент» и «Курс» имеют отношение «многие ко многим», которое определяется отношением «один ко многим» из каждой из этих таблиц с таблицей регистрации.
Следующий код содержит класс Course и два вышеупомянутых класса, т. Е. 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; } }
Вы можете видеть, что и класс Course, и класс Student имеют коллекции объектов Enrollment, которые устанавливают связь «многие ко многим» через класс соединения Enrollment.
Индивидуальные отношения
-
В отношении «один к одному» строка в таблице A может иметь не более одной совпадающей строки в таблице B, и наоборот.
-
Отношение один к одному создается, если оба связанных столбца являются первичными ключами или имеют уникальные ограничения.
-
В отношении «один к одному» первичный ключ действует дополнительно как внешний ключ, и для каждой таблицы нет отдельного столбца внешнего ключа.
В отношении «один к одному» строка в таблице 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 содержит свойство навигации Student.
Каждый студент имеет только один адрес электронной почты и пароль для входа в домен университета. Эта информация может быть добавлена в таблицу Student, но по соображениям безопасности она разделена на другую таблицу.