1

На данный момент я немного работаю с базами данных. Для этого я создал модель отношения сущности, но у меня есть небольшая проблема с ее чтением, когда речь идет о тройных операторах. Давайте посмотрим на этот пример:Модель отношения сущностей - Тернарные операторы

   ------------- (0|N)     (0|N) ------------- 
      | Mother |-----------------x----------------| Father | 
      -------------     |    ------------- 
              | 
              | 
              | 
              | 
              | (1|1) 
            ------------- 
            | Child | 
            ------------- 

Эта маленькая модель Entity Relationship звучит так:

мать может иметь от 1 до N Чайлдс - Хорошо

Отец может иметь от 1 до N Чайлдс - Хорошо

ребенок имеет exatcly 1 отец и мать 1 - Okay

Но можно также сказать:

отец имеет N матерей - не в порядке

Мать имеет N отцов - не в порядке

Так я понял, что-то неправильно или эти троичные операторы не очевидны? С помощью этой реализации можно создавать непоследовательные наборы данных. Является ли ориентация важной для этих операторов или я должен читать их по-другому?

ответ

2

Ваш основной объект является Люди. Мать, Отец и Отпрыск - это отношения между людьми.

create table People(
    ID int primary key auto_generated, 
    Sex Char(1) check(Sex in('F', 'M')), 
    ... 
); 
create unique index UQ_People_Parent on People(ID, Sex); 

Если идентификатор сам по себе уникален, поэтому сделать сочетание ID & Секс уникальный?

create table Parents(
    MotherID int, 
    FemaleFlag char(1) check FemaleFlag = 'F', 
    FatherID int, 
    MaleFlag char(1) check MaleFlag = 'M', 
    constraint FK_Parent_Mother foreign key(MotherID, FemaleFlag) 
     references People(ID, Sex), 
    constraint FK_Parent_Father foreign key(FatherID, MaleFlag) 
     references People(ID, Sex), 
    constraint PK_Parents primary key(MotherID, FatherID) 
); 

Это устанавливает таблицу пересечения m-n. Это нормально, поскольку у родителя могут быть дети с разными супругами. Добавление флага позволяет нам применять ограничение, согласно которому матери должны быть женщиной-личностью, а отцы должны быть мужчиной.

create table OffSpring(
    PersonID int primary key, 
    MotherID int, 
    FatherID int, 
    constraint FK_OffSpring_Parents foreign key(MotherID, FatherID) 
     references Parents(MotherID, FatherID), 
    constraint FK_Offspring_Person foreign key(PersonID) 
     references People(ID) 
); 

Отпрыск может быть дочерью или сыном, поэтому нет различия в зависимости от пола.

Если у нас есть идентификатор родителя, и мы хотим найти их потомство, мы можем присоединиться к людям напрямую к OffSpring, чтобы найти их в поле ID в поле MotherID или в поле FatherID, если это необходимо. Если у нас есть идентификатор OffSpring, мы можем присоединиться к OffSpring непосредственно в поле «Люди по родительскому полю» или поле «Отец» в поле «Идентификатор». Таблица родителей в основном состоит в том, чтобы обеспечить, чтобы: 1) мать и отец были определены как пара и 2) мать должна быть женщиной, отец должен быть мужчиной.

Для всех, кто это читает, пожалуйста, избавьте нас от любой политически корректной гендерной двусмысленности. Это только для иллюстрации. Если кто-то хочет Parent1 и Parent2 вместо Мать и Отец, с тем или иными мужчинами или женщинами, тогда спроектируйте это так.

1

Ваш пример не относится к тройным отношениям.

Вот более точный ERD, который соответствует вашим бизнес-правила правильно:

ERD

Пример трехкомпонентных отношений можно увидеть и объясняется here. С этой страницы:

Курс предложение должно иметь по крайней мере один человек, но может иметь много (по крайней мере, два можно было бы подумать: инструктор и одинокого студента), и человек может быть вовлечен в какой-то мере с многие курсы или вообще ничего. Атрибут роль отношений указывает на роль этого человека в жертву: студент, преподаватель и т.д.