powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Первичный ключ из нескольких внешних
25 сообщений из 148, страница 1 из 6
Первичный ключ из нескольких внешних
    #34362364
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование комбинации внешних ключей в качестве первичного какие-нибудь грабли может повлечь?
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34362398
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если на него кто-нибудь будет ссылаться,то вряд ли надо.но если это классическая табличка,раскрывающая m:n между сущностями и на нее никто не будет ссылаться-почему бы и нет.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34362441
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На него будут ссылаться другие таблицы, причем ссылающимся потребуются, как атрибуты записи с составным ключом, так и атрибуты записей на которые ссылается запись с составным ключом.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34362503
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛебедкинИспользование комбинации внешних ключей в качестве первичного какие-нибудь грабли может повлечь?
Если значение хотя бы одного поля среди этих внешних может меняться - гарантированные.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34362507
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грабли - возможное изменение мигрировавшего ключа в первоисточнике и необходимость это изменение провести по цепочкам мигрирования.
Мелкие неприятности - более длинные запросы.

Если ключевые данные родительских таблиц по определению не меняются после создания детальных записей или скажем записи детальных таблиц пересоздаются при изменении родителей, то преимущества могут перевесить грабли.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34362527
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поясню на примере, схема такая:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table table1 (
  Id1 integer primary key,
 …..
)
 
create table table2 (
  Id2 integer primary key,
 …..
)

create table table3(
  id1 integer foreign key (table1),
  id2 integer foreign key (table2),
…
  constraint primary key (id1,id2)
)
На таблицу3 по составному первичному ключу будут ссылаться другие таблицы, которым будет нужно смотреть атрибуты table3, table2 и table1.
Или лучше у таблицы3 создать, как первичный ключ id3 и ссылаться из остальных таблиц на него?
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34362544
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛебедкинНа него будут ссылаться другие таблицы, причем ссылающимся потребуются, как атрибуты записи с составным ключом, так и атрибуты записей на которые ссылается запись с составным ключом.
Тогда в большинстве случаев лучше завести отдельный суррогатный ключ и ссылаться на него, а на комбинацию внешних наложить ограничение уникальности.

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

Преимущества такого ключа - в денормализации. Скажем, дочерняя таблица в запросе может вязаться к "дедушке" минуя родителя - по части ключа, являющейся ключом в дедушке. По той же причине оказывается возможным реализовать constraint-ами некоторые проверки целостности - скажем, я люблю приводить пример

таблица <- колонки таблицы
таблица <- отчет
отчет <- колонки отчета
колонки таблицы <- колонки отчета

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

Итого, подход в некоторых случаях допустимый, но нуждающийся в тщательном продумывании. Я полагаю, его основная область применимости именно в подобного рода метаинформации - малый объем данных, но сложные, запутанные ссылки между описываемым объектами.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34362545
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRГрабли - возможное изменение мигрировавшего ключа в первоисточнике и необходимость это изменение провести по цепочкам мигрирования.
Мелкие неприятности - более длинные запросы.

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

Т.к. ключи в исходных таблицах – суррогатные, по определению они меняться не могут.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34362614
MaryCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лебедкин ModelRГрабли - возможное изменение мигрировавшего ключа в первоисточнике и необходимость это изменение провести по цепочкам мигрирования.
Мелкие неприятности - более длинные запросы.

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

Т.к. ключи в исходных таблицах – суррогатные, по определению они меняться не могут.

А их комбинация может измениться?
(Т.е. собственно значения в самом кортеже)
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34362651
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaryCat
А их комбинация может измениться?
(Т.е. собственно значения в самом кортеже)
Нет – записи могут только добавляться, причем не более одной на каждую уникальную комбинацию.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34362662
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: softwarer:
Спасибо за исчерпывающий ответ
Все плюсы и минусы понятны
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34363642
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerПреимущества такого ключа - в денормализации.Не понял, какое отношение имеет составной ключ к денормализации. Где и какая нормальная форма нарушается ? Можете пояснить ?
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34363751
MaryCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ChA softwarerПреимущества такого ключа - в денормализации.Не понял, какое отношение имеет составной ключ к денормализации. Где и какая нормальная форма нарушается ? Можете пояснить ?

Насколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34363767
Фотография Rin@t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом.
А вот и не помните: BCNF - нормальная форма Бойса-Кодда .
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34363783
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом.
Из этого следует в общем случае, что если в справочник нельзя вводить более одной записи с одним кодом (уникальность по коду), то в нем не может быть никакого другого первичного ключа, в том числе суррогатного, то есть, на такие справочники ссылка всегда должна быть по ЕК, а не по СК. Бред-с?
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34363802
MaryCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Васкецов MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом.
Из этого следует в общем случае, что если в справочник нельзя вводить более одной записи с одним кодом (уникальность по коду), то в нем не может быть никакого другого первичного ключа, в том числе суррогатного, то есть, на такие справочники ссылка всегда должна быть по ЕК, а не по СК. Бред-с?

Сдаюсь!
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34363833
MaryCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaryCat Сергей Васкецов MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом.
Из этого следует в общем случае, что если в справочник нельзя вводить более одной записи с одним кодом (уникальность по коду), то в нем не может быть никакого другого первичного ключа, в том числе суррогатного, то есть, на такие справочники ссылка всегда должна быть по ЕК, а не по СК. Бред-с?

Сдаюсь!

Ваще, спасибо, что вправили мозги, ибо всегда думала, что до BCNF не дотягиваю. Именно потому, что практически везде ввожу суррогатный ключ, привычка и весьма неплохая. имхо. Ибо в 90% оказывается , что даже на связь ММ рано или поздно возникает необходимость сослаться.

Век живи, век учись, дураком помрешь.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34364978
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом.
Вне зависимости от того, требует или нет, требование совершенно идиотское. Скажем, что делать с таблицей Люди (имя, номер_паспорта, инн)? Пилить на две?
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34365032
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA softwarerПреимущества такого ключа - в денормализации.Не понял, какое отношение имеет составной ключ к денормализации. Где и какая нормальная форма нарушается ? Можете пояснить ?

Нарушается принцип один факт - одна запись.
Запись в table3 - это факт связи записей table1 и table2. Если в table4 создать запись со ссылкой на table3, тот же самый факт связи записей table1 и table2 будет отражён в БД ещё раз.

В итоге мы получаем аномалию обновления. Изменяя или удаляя запись из table3 мы хотим разорвать нашу связь, но она сохраняется в table4 и только ограничения ссылочной целостности БД могут нас остановить. В общем случае для изменения записи в table3 придётся каскадом обновить множество других записей, что неудобно и чревато нарушением целостности. Если функция каскадного обновления поддержана в СУБД, или обновлять записи в table3 вообще не требуется, особых проблем не возникает, и даже можно получить некоторые преимущества - исключить table3 из запросов.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34365036
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAНе понял, какое отношение имеет составной ключ к денормализации. Где и какая нормальная форма нарушается ?
Зависит от. Скажем, в приведенном мной примере подразумевается нарушение второй.

Быть может я неправ, но по моим ощущениям, термин "денормализация" сейчас означает нечто большее, нежели "нарушение нормальных форм", которые, при всей их полезности, избавляют не от всех возможных некорректностей. Скажем, давайте рассмотрим таблицы из моего примера:

Код: plaintext
1.
2.
3.
create table "tables" ( table#, ...) ;
create table "table_columns" ( table_column#, table#, ...) ;
create table "reports" ( report#, table#, ...) ;
create table "report_columns" ( report#, table#, table_column#, ...) ;

Что касается table#, с ним все понятно - самый обычный автоинкрементный ключ. Интерес представляют колонки report# и table_column#. У нас есть выбор:

1. Сделать их уникальными (то есть потенциальными ключами), опять же обычный автоинкремент.
2. Сделать их уникальными в пределах #table, но не гарантируя уникальность вообще.

Полагаю, очевидно, что первое решение "гарантированно не хуже" второго. Гарантированно - в том плане, что это "второе плюс дополнительное требование", а следовательно, любая аномалия, допускаемая первым, допускается и во втором итп. Короче говоря, множество недостатков первого подхода содержится во множестве недостатков второго подхода. Мало того, легко назвать, чем первых подход лучше, то есть включение строгое, множества не равны. Однако! Однако, второй подход строго соблюдает нормальные формы, в то время как первый - нарушает.

По этой причине мне кажется правильным рассматривать фактическую ситуацию, не переоценивая формальные критерии соответствия.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34365041
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом.
Вне зависимости от того, требует или нет, требование совершенно идиотское. Скажем, что делать с таблицей Люди (имя, номер_паспорта, инн)? Пилить на две?

Пилить. На "Паспорта" и "Свидетельства о постановке на учёт в налоговой". Создать таблицу связей (номер_паспорта, инн), которая будет говорить, что эти документы принадлежат одному лицу. Поскольку в примере только одна из таблиц (например "Паспорта") будет содержать имя, другую таблицу, которая состоит только из первичного ключа (попросту определяет домен), можно удалить.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34365089
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab softwarer MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом.
Вне зависимости от того, требует или нет, требование совершенно идиотское. Скажем, что делать с таблицей Люди (имя, номер_паспорта, инн)? Пилить на две?

Пилить. На "Паспорта" и "Свидетельства о постановке на учёт в налоговой". Создать таблицу связей (номер_паспорта, инн), которая будет говорить, что эти документы принадлежат одному лицу. Поскольку в примере только одна из таблиц (например "Паспорта") будет содержать имя, другую таблицу, которая состоит только из первичного ключа (попросту определяет домен), можно удалить.

Пилите дальше, Шура! Паспорта тоже меняют, как минимум 2 или 3 раза... :)
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34365101
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabПилить. На "Паспорта" и "Свидетельства о постановке на учёт в налоговой".
И зачем? Чтобы скучно не было?

Сахават ЮсифовПаспорта тоже меняют, как минимум 2 или 3 раза... :)
Вот только постановка задачи не говорит, что информация о предыдущих паспортах хоть кому-нибудь интересна.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34365115
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сахават Юсифов mcureenab softwarer MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом.
Вне зависимости от того, требует или нет, требование совершенно идиотское. Скажем, что делать с таблицей Люди (имя, номер_паспорта, инн)? Пилить на две?

Пилить. На "Паспорта" и "Свидетельства о постановке на учёт в налоговой". Создать таблицу связей (номер_паспорта, инн), которая будет говорить, что эти документы принадлежат одному лицу. Поскольку в примере только одна из таблиц (например "Паспорта") будет содержать имя, другую таблицу, которая состоит только из первичного ключа (попросту определяет домен), можно удалить.

Пилите дальше, Шура! Паспорта тоже меняют, как минимум 2 или 3 раза... :)

Дальше не видно куда пилить. Примерчик маловат. Однако, при смене паспорта можно просто создать новую запись в таблице связей, при смене ИНН следующую и так проследить чела до тех пор, пока он не поменяет все документы разом.
...
Рейтинг: 0 / 0
Первичный ключ из нескольких внешних
    #34365636
мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerОднако, второй подход строго соблюдает нормальные формы, в то время как первый - нарушает.
Не надо включать(мысленно) суррогатный ключ в состав полей таблицы: и овцы сыты и волки целы.
...
Рейтинг: 0 / 0
25 сообщений из 148, страница 1 из 6
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Первичный ключ из нескольких внешних
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]