Первичный ключ / внешний ключ для таблицы с двумя соединительными таблицами - PullRequest
1 голос
/ 12 мая 2019

Допустим, у меня есть таблица A с двумя соединительными таблицами B и C. Как мне создать первичные ключи для таблицы A?У меня есть два из этих типов таблиц в диаграмме, которую я нарисовал, ключи окружности, кстати, являются внешними ключами.

Изображение со стыковочными таблицами

image

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Вашему игровому столу нужен только один первичный ключ: он определяет каждую конкретную игру. В таблицах соединений первичные ключи состоят из первичного ключа игры и первичного ключа директоров (или типов).

1 голос
/ 12 мая 2019

Взято из ссылки в руководстве Первичный ключ MySQL :

CREATE TABLE roles(
   role_id INT AUTO_INCREMENT,
   role_name VARCHAR(50),
   PRIMARY KEY(role_id)
);

Трудно предоставить информацию по вашему конкретному вопросу, потому что в нем слишком мало деталей.

Из вашего комментария "если к таблице прикреплены две соединительные таблицы, понадобятся ли ей два первичных ключа?" . Нет.

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

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

Многие СУБД позволяют задавать ПЕРВИЧНЫЙ КЛЮЧ в определении физической таблицы. Большинство также позволяют определять FOREIGN KEYs на физической таблице. То, что они делают с ними, может варьироваться от одной реализации к другой. Многие используют определение ПЕРВИЧНОГО КЛЮЧА для определения УНИКАЛЬНОГО ИНДЕКСА некоторого вида, чтобы обеспечить обязательную уникальную идентификацию каждой записи в таблице.

Итак, нет, вашей таблице games_directors не нужны и не могут быть два первичных ключа. если вы решили указать PRIMARY KEY, вам нужно будет указать все столбцы, которые однозначно идентифицируют записи в таблице games_directors - скорее всего, PRIMARY KEY (game_id, director_id).

Аналогично, ПЕРВИЧНЫЙ КЛЮЧ для игрового стола, вероятно, будет PRIMARY KEY (game_id), для директоров, вероятно, будет PRIMARY KEY (director_id), а для типов игр это, вероятно, будет PRIMARY KEY (game_type_id).

Вы можете использовать внешний ключ из таблицы games_directors, чтобы при добавлении в него записей существовал соответствующий директор в таблице игр и таблице директоров. В этом случае ваша таблица games_directors будет иметь два отношения внешнего ключа (одно для игр, а другое для директоров). Но только один ПЕРВИЧНЫЙ КЛЮЧ.

Таким образом, вы можете получить что-то вроде этого:

create table games (
     game_id integer,
     PRIMARY KEY (game_id)
  );

create table directors (
    director_id integer,
    PRIMARY KEY (director_id)
    );

CREATE TABLE games_directors (
    game_id     INTEGER NOT NULL,
    director_id INTEGER NOT NULL,
    commission_paid DECIMAL(10,2),

  PRIMARY KEY (game_id, director_id),
  FOREIGN KEY (game_id) REFERENCES games(game_id),
  FOREIGN KEY (director_id) REFERENCES directors(director_id)
);

NB. Я не проверял вышеизложенное с помощью PostgreSql. Синтаксис должен работать для большинства СУБД, но некоторые могут потребовать незначительной настройки.

Индексы могут использоваться для ускорения доступа к отдельным записям в таблице. Например, вы можете захотеть создать индекс по имени директора или идентификатору директора (в зависимости от того, как вы чаще всего обращаетесь к этой таблице). Если вы в основном обращаетесь к таблице директора с условием равенства, подобным следующему: where director_name = 'fred', тогда имеет смысл индекс по имени_ директора .

Индексы становятся более полезными по мере роста количества записей в таблицах.

Надеюсь, это ответит на ваш вопрос. : -)

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