Каково соглашение для нормализации таблицы со многими первичными ключами - PullRequest
0 голосов
/ 13 марта 2019

У меня есть таблица базы данных примерно так:

col1 PRI
col2 PRI
col3 PRI
col4 PRI
col5 PRI
col6 
col7
col8

Итак, похоже, что все столбцы с 1 по 5 должны быть уникальными, и что имеет смысл «просто сделать эти ключи первичными». Это правильный способ проектирования или мы должны просто добавить новый автоматически сгенерированный столбец с уникальным ограничением на 5 столбцов? Мы будем запрашивать либо подмножество этих столбцов (col1 - col3), либо все 5 столбцов

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Это нормально; Я не вижу необходимости в сгенерированном столбце:

PRIMARY KEY(a,b,c,d,e)

Если он у вас есть, он будет работать эффективно:

WHERE b=22 AND c=333 AND a=4444  -- in any order

Большинство других комбинаций будут менее эффективными.

(Пожалуйста, используйте настоящие имена столбцов, чтобы мы могли обсудить более подробно.)

0 голосов
/ 13 марта 2019

Если вы установите столбцы как UNIQUE, произойдет сбой, поскольку столбец col1 не может быть равен двум разным строкам.

Но если вы установите столбцы как PRIMARY KEY, но не UNIQUE, база данных предполагает, что комбинация всех первичных ключей должна быть значением 'UNIQUE', поэтому col1 + col2 + col3 + col4 + col5 не может быть найдено ни на одном другой ряд.

Надеюсь, это поможет.

EDIT

Вот пример:

create table example (
col1    bigint  not null unique,
col2    bigint  not null,
primary key (col1,col2));

insert into example values(1,1);  ==> Success
insert into example values(1,2);  ==> Failure - col1 is unique and '1' was used
insert into example values(2,1);  ==> Success - '2' was never used on col1
insert into example values(2,7);  ==> Failure - '2' was already used on col1

Но если вы используете вместо:

create table example (
col1    bigint  not null,
col2    bigint  not null,
primary key (col1,col2));

insert into example values(1,1);  ==> Success
insert into example values(1,2);  ==> Success
insert into example values(2,1);  ==> Success
insert into example values(1,2);  ==> Failure - '1','2' combination was used
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...