Если таблица содержит атрибут, который гарантированно будет уникальным, отличным от значения Null и может служить для идентификации строки, не обязательно ради соблюдения традиции добавлять псевдоключ.
С практической точки зрения нередко каждый атрибут в таблице подвергается изменениям или не является уникальным. Базы данных имеют тенденцию развиваться на протяжении срока жизни проекта, и ответственные лица могут не соблюдать требование неприкосновенности естественного ключа. Бывает, что столбец, который на первый взгляд мог быть хорошим естественным ключом, содержит допустимые дубликаты. В таких случаях единственным решением будет псевдоключ.
Используйте составные ключи там, где они уместны. Когда строка лучше всего идентифицируется по комбинации нескольких столбцов атрибутов, как в таблице BugsProducts, используйте эти столбцы в составном первичном ключе.
Файл примера:JD-Required/soln/compound.sql
CREATE TABLE BugsProducts (
bug_id BIGINT UNSIGNED NOT NULL,
product_id BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (bug_id, product_id),
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id),
FOREIGN KEY (product_id) REFERENCES Products(product_id)) ;
INSERT INTO BugsProducts (bug_id, product__id) VALUES (1234, 1), (1234, 2), (1234, 3);
INSERT INTO BugsProducts (bug_id, product_id)
VALUES (1234, 1); — ошибка: дублированная запись
Обратите внимание, что внешние ключи, ссылающиеся на составной первичный ключ, также должны быть составными. Может показаться странным дублирование этих столбцов в зависимых таблицах, но столбцы могут обладать и достоинствами: они позволяют упрощать запрос, нуждающийся в операции объединения для выборки атрибутов строки, на которую выполняется ссылка.
ВНИМАНИЕ!
Соглашения хороши, только если они полезны.Победоносные воины сначала выигрывают сражение, и затем идут на войну, тогда как проигравшие воины сначала идут на войну, а затем пытаются победить. Сун Тзю |