Ассоциация лучший образец - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть вопрос о концепции отношения SQL. У меня есть простой пример. Человек за столом, страна и я хотим записать историю, где человек жил.

CREATE TABLE person
(
    person_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT
);

CREATE TABLE country
(
    country_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT
);

Первое решение:

create table person_live_country
(
    plc_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    person_id INT UNSIGNED NOT NULL,
    country_id INT UNSIGNED NOT NULL,
    FOREIGN KEY (person_id) REFERENCES person (person_id),
    FOREIGN KEY (country_id) REFERENCES country (country_id)
);

Второе решение:

create table person_live_country
(
    person_id INT UNSIGNED NOT NULL,
    country_id INT UNSIGNED NOT NULL,
    PRIMARY KEY (person_id, country_id),
    FOREIGN KEY (person_id) REFERENCES person (person_id),
    FOREIGN KEY (country_id) REFERENCES country (country_id)
);

Какая модель лучше: концепция, производительность, удобство? В будущем я хочу сопоставить таблицы с JPA.

Спасибо.

1 Ответ

1 голос
/ 18 ноября 2011

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

  • Если вы хотите расширить дизайн таблицы в будущем, например, добавить fromdate и todate засоряются в таблице person_live-country, первичный ключ композитного кода во втором решении больше не будет работать.Один и тот же человек может проживать в одной и той же стране более одного раза за всю свою жизнь.
  • Если вам нужно ссылаться на person_live-country таблицу из другой таблицы как на внешний ключ, первое решение проще.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...