Как мне изменить эту схему в 3NF? - PullRequest
0 голосов
/ 08 мая 2019

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

Моя проблема в том, что таблица Wars не в 3NF из-за множества значений в поле Combatants, так как в войне может быть много комбатантов (т.е. наций).

Как мне изменить эту схему на 3NF без создания каких-либо искусственных ключей (т.е. только с использованием полей, которые у меня есть в настоящее время)?

CREATE TABLE Wars (
  Name CHAR(50) PRIMARY KEY,
  StartingDate DATE NOT NULL,
  EndingDate DATE NOT NULL,
  Cause CHAR(50) NOT NULL,
  Combatants CHAR(50) NOT NULL,
  TodaysDate DATE DEFAULT SYSDATE,
  CONSTRAINT CHK_TD CHECK(EndingDate < TodaysDate),
  CONSTRAINT CHK_SD CHECK(StartingDate > 0);

CREATE TABLE Nations (
  Name CHAR(50) PRIMARY KEY,
  StartingDate DATE NOT NULL,
  EndingDate DATE,
  TodaysDate DATE DEFAULT SYSDATE,
  CONSTRAINT CHK_TD CHECK(EndingDate < TodaysDate);

1 Ответ

0 голосов
/ 08 мая 2019

То, что у вас здесь есть, это отношение «многие ко многим», когда в войне может участвовать несколько наций, а нация может участвовать в нескольких войнах.

Чтобы представить это в вашей схеме:

1) Удалите поле «комбатанты» из таблицы «Войны»

2) Создайте таблицу «NationsWars» (или как вы хотите ее называть).Он должен содержать только название страны и военное имя.

3) Каждое из этих двух полей будет иметь внешний ключ обратно к первичному ключу соответствующих родительских таблиц.

4) Первичным ключом этой новой таблицы будет составной ключ, состоящий из обоих полей, упомянутых выше.

Это классический, стандартный способ представления отношений «многие ко многим», таких как этот.


NB. Я не уверен, почему у вас есть возражение против искусственных ключей здесь.Я бы сказал, что числовые идентификаторы автоинкремента были бы идеальными ключами для таблиц наций и войн ... таким образом, если нация меняет свое имя, или вы понимаете, что сделали опечатку, или хотите переименовать войну, тогдаВы можете сделать это без нарушения каких-либо ключевых ограничений.Обычно считается плохой практикой использовать поля имени или описания в качестве ключей, потому что они почти всегда подвержены изменениям в долгосрочной перспективе.Первичный ключ должен быть чем-то, что однозначно и постоянно идентифицирует конкретную запись, и не имеет другого контекстуального значения.

...