Как представить одну и ту же таблицу (с разными значениями) в отношении 1: N с двумя другими таблицами? - PullRequest
0 голосов
/ 19 декабря 2018

enter image description here

У меня есть три таблицы:

  • Guardian
  • Student
  • Address

Один Guardian может иметь много Addresses, а один Student может иметь много Addresses.

Наблюдения:

  • Guardian адреса могут совпадать с Students
  • Guardian адреса могут отличаться от Student

This:

addressLine1 = Foo, addressLine2 = Бар ( Студент )

отличается от этого

addressLine1 = Foo, addressLine2 = Бар ( Хранитель )

Просто указав:

  1. Один Guardian имеет много Students, прикрепленных к нему
  2. Один Student имеетмногие Guardians прикрепленные к нему

Guardian и Students имеют как общие, так и специфические атрибуты.

Прямо сейчас я отображаю приведенный ниже фрагмент кода:

CREATE TABLE address 
  ( 
     id          BIGINT, 
     /* OTHER FIELDS OMITTED */ 
     guardian_id BIGINT, 
     student_id  BIGINT, 
     PRIMARY KEY (id) 
  ) 


CREATE TABLE guardian 
  ( 
     id BIGINT, 
     /* OTHER FIELDS OMITTED */ 
     PRIMARY KEY (id) 
  ) 

CREATE TABLE student 
  ( 
     id BIGINT, 
     /* OTHER FIELDS OMITTED */ 
     PRIMARY KEY (id) 
  ) 

ALTER TABLE address 
  ADD CONSTRAINT constraint_id FOREIGN KEY (guardian_id) 
  REFERENCES guardian 

ALTER TABLE address 
  ADD CONSTRAINT constraint_id FOREIGN KEY (student_id) REFERENCES 
  student 

Это правильный путь?Я имею в виду, есть лучшее решение для этого случая?

* Адрес не таблица соединения, если я правильно.Это не сделано для целей отношений.У него есть свои специфические поля.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Почему два студента или два опекуна не могут иметь один и тот же адрес?Ваша модель ограничивает это одним из каждого типа.

Вам нужны таблицы соединений / связей для двух сущностей.Я написал бы это как:

CREATE TABLE addresses ( 
    addrees_id BIGINT PRIMARY KEY,
    . . . 
);

CREATE TABLE guardians ( 
    guardian_id BIGINT PRIMARY KEY, 
    . . .
);

CREATE TABLE students (
    student_id BIGINT PRIMARY KEY, 
     /* OTHER FIELDS OMITTED */ 
); 

CREATE TABLE guardian_addresses (
    guardian_address_id BIGINT PRIMARY KEY,
    guardian_id BIGINT NOT NULL,
    address_id BIGINT NOT NULL,
    . . .  -- other information such a date and who added
    constraint guardian_addresses_guardians foreign key (guardian_id) references guardians(guardian_id),
    constraint guardian_addresses_addresses foreign key (address_id) references addresses(address_id)
);

CREATE TABLE student_addresses (
    student_address_id BIGINT PRIMARY KEY,
    student_id BIGINT NOT NULL,
    address_id BIGINT NOT NULL,
    . . .  -- other information such a date and who added
    constraint student_addresses_guardians foreign key (student_id) references students(student_id),
    constraint student_addresses_addresses foreign key (address_id) references addresses(address_id)
);

Вы заметите, что это включает в себя некоторые другие соглашения:

  • Таблицы названы во множественном числе, потому что они содержат несколько копий сущностей.
  • Первичные ключи названы в единственном числе с _id в конце.Таким образом, ссылки на внешние ключи обычно используют одно и то же имя столбца.
  • PRIMARY KEY является встроенным.
0 голосов
/ 19 декабря 2018
Gardian -- M:M -- Address
Student -- M:M -- Address

Вам нужны две дополнительные таблицы ссылок, такие как guardian_adresses и student_adresses, чтобы смоделировать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...