|
|
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
Использование комбинации внешних ключей в качестве первичного какие-нибудь грабли может повлечь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 08:43 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
если на него кто-нибудь будет ссылаться,то вряд ли надо.но если это классическая табличка,раскрывающая m:n между сущностями и на нее никто не будет ссылаться-почему бы и нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 08:57 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
На него будут ссылаться другие таблицы, причем ссылающимся потребуются, как атрибуты записи с составным ключом, так и атрибуты записей на которые ссылается запись с составным ключом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 09:16 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ЛебедкинИспользование комбинации внешних ключей в качестве первичного какие-нибудь грабли может повлечь? Если значение хотя бы одного поля среди этих внешних может меняться - гарантированные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 09:39 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
Грабли - возможное изменение мигрировавшего ключа в первоисточнике и необходимость это изменение провести по цепочкам мигрирования. Мелкие неприятности - более длинные запросы. Если ключевые данные родительских таблиц по определению не меняются после создания детальных записей или скажем записи детальных таблиц пересоздаются при изменении родителей, то преимущества могут перевесить грабли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 09:40 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
Поясню на примере, схема такая: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Или лучше у таблицы3 создать, как первичный ключ id3 и ссылаться из остальных таблиц на него? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 09:48 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ЛебедкинНа него будут ссылаться другие таблицы, причем ссылающимся потребуются, как атрибуты записи с составным ключом, так и атрибуты записей на которые ссылается запись с составным ключом. Тогда в большинстве случаев лучше завести отдельный суррогатный ключ и ссылаться на него, а на комбинацию внешних наложить ограничение уникальности. Ссылка на такой вот "составной ключ из внешних ключей" довольно неудобна в запросах, как сама по себе (писать join по двум-трем-четырем полям вместо одного), так и особенно тем, что проблема склонна нарастать снежным комом, атрибуты мигрируют во все новые таблицы, их везде надо заполнять, ключи становятся все более и более составными, начинают занимать уйму места.... Преимущества такого ключа - в денормализации. Скажем, дочерняя таблица в запросе может вязаться к "дедушке" минуя родителя - по части ключа, являющейся ключом в дедушке. По той же причине оказывается возможным реализовать constraint-ами некоторые проверки целостности - скажем, я люблю приводить пример таблица <- колонки таблицы таблица <- отчет отчет <- колонки отчета колонки таблицы <- колонки отчета Такая вот "ромбовидная связь" со смыслом "отчет строится над таблицей, колонки отчета опираются на колонки таблицы". При использовании суррогатных ключей потребуется писать триггер, который будет проверять, что колонки отчета не ссылаются на колонки из какой-либо другой (не-отчетной) таблицы. При использовании же составных ключей это гарантируется внешними ключами (миграцией ключа таблицы через отчет и через колонки таблицы в колонки отчета). Итого, подход в некоторых случаях допустимый, но нуждающийся в тщательном продумывании. Я полагаю, его основная область применимости именно в подобного рода метаинформации - малый объем данных, но сложные, запутанные ссылки между описываемым объектами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 09:51 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ModelRГрабли - возможное изменение мигрировавшего ключа в первоисточнике и необходимость это изменение провести по цепочкам мигрирования. Мелкие неприятности - более длинные запросы. Если ключевые данные родительских таблиц по определению не меняются после создания детальных записей или скажем записи детальных таблиц пересоздаются при изменении родителей, то преимущества могут перевесить грабли. Т.к. ключи в исходных таблицах – суррогатные, по определению они меняться не могут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 09:51 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
Лебедкин ModelRГрабли - возможное изменение мигрировавшего ключа в первоисточнике и необходимость это изменение провести по цепочкам мигрирования. Мелкие неприятности - более длинные запросы. Если ключевые данные родительских таблиц по определению не меняются после создания детальных записей или скажем записи детальных таблиц пересоздаются при изменении родителей, то преимущества могут перевесить грабли. Т.к. ключи в исходных таблицах – суррогатные, по определению они меняться не могут. А их комбинация может измениться? (Т.е. собственно значения в самом кортеже) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 10:16 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
MaryCat А их комбинация может измениться? (Т.е. собственно значения в самом кортеже) Нет – записи могут только добавляться, причем не более одной на каждую уникальную комбинацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 10:25 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
To: softwarer: Спасибо за исчерпывающий ответ Все плюсы и минусы понятны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 10:27 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
softwarerПреимущества такого ключа - в денормализации.Не понял, какое отношение имеет составной ключ к денормализации. Где и какая нормальная форма нарушается ? Можете пояснить ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 14:08 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ChA softwarerПреимущества такого ключа - в денормализации.Не понял, какое отношение имеет составной ключ к денормализации. Где и какая нормальная форма нарушается ? Можете пояснить ? Насколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 14:34 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом. А вот и не помните: BCNF - нормальная форма Бойса-Кодда . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 14:37 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом. Из этого следует в общем случае, что если в справочник нельзя вводить более одной записи с одним кодом (уникальность по коду), то в нем не может быть никакого другого первичного ключа, в том числе суррогатного, то есть, на такие справочники ссылка всегда должна быть по ЕК, а не по СК. Бред-с? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 14:39 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом. Из этого следует в общем случае, что если в справочник нельзя вводить более одной записи с одним кодом (уникальность по коду), то в нем не может быть никакого другого первичного ключа, в том числе суррогатного, то есть, на такие справочники ссылка всегда должна быть по ЕК, а не по СК. Бред-с? Сдаюсь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 14:45 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
MaryCat Сергей Васкецов MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом. Из этого следует в общем случае, что если в справочник нельзя вводить более одной записи с одним кодом (уникальность по коду), то в нем не может быть никакого другого первичного ключа, в том числе суррогатного, то есть, на такие справочники ссылка всегда должна быть по ЕК, а не по СК. Бред-с? Сдаюсь! Ваще, спасибо, что вправили мозги, ибо всегда думала, что до BCNF не дотягиваю. Именно потому, что практически везде ввожу суррогатный ключ, привычка и весьма неплохая. имхо. Ибо в 90% оказывается , что даже на связь ММ рано или поздно возникает необходимость сослаться. Век живи, век учись, дураком помрешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 14:52 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом. Вне зависимости от того, требует или нет, требование совершенно идиотское. Скажем, что делать с таблицей Люди (имя, номер_паспорта, инн)? Пилить на две? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 20:33 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ChA softwarerПреимущества такого ключа - в денормализации.Не понял, какое отношение имеет составной ключ к денормализации. Где и какая нормальная форма нарушается ? Можете пояснить ? Нарушается принцип один факт - одна запись. Запись в table3 - это факт связи записей table1 и table2. Если в table4 создать запись со ссылкой на table3, тот же самый факт связи записей table1 и table2 будет отражён в БД ещё раз. В итоге мы получаем аномалию обновления. Изменяя или удаляя запись из table3 мы хотим разорвать нашу связь, но она сохраняется в table4 и только ограничения ссылочной целостности БД могут нас остановить. В общем случае для изменения записи в table3 придётся каскадом обновить множество других записей, что неудобно и чревато нарушением целостности. Если функция каскадного обновления поддержана в СУБД, или обновлять записи в table3 вообще не требуется, особых проблем не возникает, и даже можно получить некоторые преимущества - исключить table3 из запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 21:13 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ChAНе понял, какое отношение имеет составной ключ к денормализации. Где и какая нормальная форма нарушается ? Зависит от. Скажем, в приведенном мной примере подразумевается нарушение второй. Быть может я неправ, но по моим ощущениям, термин "денормализация" сейчас означает нечто большее, нежели "нарушение нормальных форм", которые, при всей их полезности, избавляют не от всех возможных некорректностей. Скажем, давайте рассмотрим таблицы из моего примера: Код: plaintext 1. 2. 3. Что касается table#, с ним все понятно - самый обычный автоинкрементный ключ. Интерес представляют колонки report# и table_column#. У нас есть выбор: 1. Сделать их уникальными (то есть потенциальными ключами), опять же обычный автоинкремент. 2. Сделать их уникальными в пределах #table, но не гарантируя уникальность вообще. Полагаю, очевидно, что первое решение "гарантированно не хуже" второго. Гарантированно - в том плане, что это "второе плюс дополнительное требование", а следовательно, любая аномалия, допускаемая первым, допускается и во втором итп. Короче говоря, множество недостатков первого подхода содержится во множестве недостатков второго подхода. Мало того, легко назвать, чем первых подход лучше, то есть включение строгое, множества не равны. Однако! Однако, второй подход строго соблюдает нормальные формы, в то время как первый - нарушает. По этой причине мне кажется правильным рассматривать фактическую ситуацию, не переоценивая формальные критерии соответствия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 21:16 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
softwarer MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом. Вне зависимости от того, требует или нет, требование совершенно идиотское. Скажем, что делать с таблицей Люди (имя, номер_паспорта, инн)? Пилить на две? Пилить. На "Паспорта" и "Свидетельства о постановке на учёт в налоговой". Создать таблицу связей (номер_паспорта, инн), которая будет говорить, что эти документы принадлежат одному лицу. Поскольку в примере только одна из таблиц (например "Паспорта") будет содержать имя, другую таблицу, которая состоит только из первичного ключа (попросту определяет домен), можно удалить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 21:20 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
mcureenab softwarer MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом. Вне зависимости от того, требует или нет, требование совершенно идиотское. Скажем, что делать с таблицей Люди (имя, номер_паспорта, инн)? Пилить на две? Пилить. На "Паспорта" и "Свидетельства о постановке на учёт в налоговой". Создать таблицу связей (номер_паспорта, инн), которая будет говорить, что эти документы принадлежат одному лицу. Поскольку в примере только одна из таблиц (например "Паспорта") будет содержать имя, другую таблицу, которая состоит только из первичного ключа (попросту определяет домен), можно удалить. Пилите дальше, Шура! Паспорта тоже меняют, как минимум 2 или 3 раза... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 22:06 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
mcureenabПилить. На "Паспорта" и "Свидетельства о постановке на учёт в налоговой". И зачем? Чтобы скучно не было? Сахават ЮсифовПаспорта тоже меняют, как минимум 2 или 3 раза... :) Вот только постановка задачи не говорит, что информация о предыдущих паспортах хоть кому-нибудь интересна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 22:13 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
Сахават Юсифов mcureenab softwarer MaryCatНасколько помнится, нормальная форма Бойса-Кодда требует, чтобы в таблице был только один потенциальный первичный ключ. Т.е. строку в таблице можно было идентифицировать единственным способом. Вне зависимости от того, требует или нет, требование совершенно идиотское. Скажем, что делать с таблицей Люди (имя, номер_паспорта, инн)? Пилить на две? Пилить. На "Паспорта" и "Свидетельства о постановке на учёт в налоговой". Создать таблицу связей (номер_паспорта, инн), которая будет говорить, что эти документы принадлежат одному лицу. Поскольку в примере только одна из таблиц (например "Паспорта") будет содержать имя, другую таблицу, которая состоит только из первичного ключа (попросту определяет домен), можно удалить. Пилите дальше, Шура! Паспорта тоже меняют, как минимум 2 или 3 раза... :) Дальше не видно куда пилить. Примерчик маловат. Однако, при смене паспорта можно просто создать новую запись в таблице связей, при смене ИНН следующую и так проследить чела до тех пор, пока он не поменяет все документы разом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2007, 22:19 |
|
||
|
|

start [/forum/topic.php?fid=32&startmsg=34362364&tid=1544689]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 465ms |

| 0 / 0 |
