Нужен ли суррогатный ключ в отношениях один ко многим? - PullRequest
0 голосов
/ 13 июля 2009
create table A (
    id int(10) not null, 
    val1 varchar(255), 
    primary key (id)
);

Подход [a]:

create table B (
    a_id int(10) not null, 
    val2 varchar(255), 

    foreign key (a_id) references A(id)
);

Подход [b]:

create table B (
    id int(10) not null, 
    a_id int(10) not null, 
    val2 varchar(255), 

    foreign key (a_id) references A(id), 
    primary key (id)
);

Выбрав [a], я могу избежать создания суррогатного ключа «id» в таблице «B». Какой подход является предпочтительным для создания таблицы «B» с точки зрения моделирования?

Ответы [ 3 ]

4 голосов
/ 13 июля 2009

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

CREATE TABLE A (
    Val1 varchar() not null,
    constraint PK_A KEY (Val1) --?
)

CREATE TABLE B (
    Val1 varchar() not null,
    Val2 varchar() not null,
    constraint PK_B KEY (Val2), --? or Val1,Val2?
    constraint FK_A FOREIGN KEY (Val1) references A
)

(Выше в выдуманном SQL, но, надеюсь, вы понимаете смысл)

Теперь для физической модели вы можете вводить суррогаты везде, где они имеют смысл - где логические ключи длинные (например, varchars). Но действительно ли вы это делаете или нет, зависит от вас. И не забывайте применять логические ключи еще

1 голос
/ 13 июля 2009

Для суррогатных ключей в целом,

Профессор в моем курсе информатики говорит "Нет".

Практический опыт для меня, говорит, да.

Я предпочитаю использовать один, несмотря на увеличение места только для удобства чтения операторов SQL и большей гибкости в случае изменения требований.

0 голосов
/ 13 июля 2009

Насколько я понимаю: в [a] вы создаете отношения 1: 1, в [b] - нет. Они не альтернативы!

В случае [b], если таблица A будет содержать счета-фактуры, таблица B может использоваться для invoicelines, тогда как в [a] это не может быть, так как для каждой записи в таблице A. может быть только одна запись (таким образом, только 1 invoiceline за счет)

Итак, если вы действительно хотите получить ответ, используйте [b], ваша конструкция [a] может быть заменена только одной таблицей, и, вероятно, это не то, что вы имеете в виду. (также, поскольку вы не установили первичный ключ, такой же, как FK в отношении 1: 1)

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