powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Синтетический ключ для таблицы many-to-many
33 сообщений из 33, показаны все 2 страниц
Синтетический ключ для таблицы many-to-many
    #32440002
Романыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть стандартная связь User-UserRoles-Roles. Вопрос, чем грозит подмена PK в таблице UserRoles (UserID, RoleID) на пару PK(UserRoleID) + unique index(UserID, RoleID)?
По теории получается т.н. Non-identifying relationship.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32440106
f2f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
f2f
Гость
Ну я обычно так и делаю
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32440118
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничем особым не грозит. Только некрасивостью структуры - лишним сурроатным ключом.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32441192
Фотография Quark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НАсколько понял,
связку
Код: plaintext
 PK(UserRoleID) + unique index(UserID, RoleID)

Вы хотите создать для быстрого поиска по имени пользователя?
лучше создайте для этого дополнительный индекс.
Возможно место будет и больше занимать(но не факт), но красивее будет точно.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32441348
Романыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, здесь именно подмена PK(UserID,RoleID) на ключ, состоящий из одного поля - UserRoleID плюс альтернативный ключ (уник. индекс ) АК(UserID,RoleID)
Подобная же практика сделана для всех FK таблиц - подмена какого-нить (OrderId(FK),LineNo) на PK(LineID) + AK(OrderId(FK),LineNo).
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32441686
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
структура PK(UserRoleID) + unique index(UserID, RoleID) нужна когода хочешь, что бы на эту таблицу кто-то ссылался (по UserRoleID), иначе структура должна быть PK(UserID, RoleID)
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32441793
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторPK(UserRoleID) + unique index(UserID, RoleID) нужна когода хочешь, что бы на эту таблицу кто-то ссылался (по UserRoleID)
А что, этому кому-то религия не позволяет ссылаться по составному ключу (UserID, RoleID)?
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32441857
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ЛП
Да! Именно так! Это - вопрос скорее религии, чем чего-то еще ;-)))
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32441952
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, этому кому-то религия не позволяет ссылаться по составному ключу (UserID, RoleID)?


Да! Именно так! Это - вопрос скорее религии, чем чего-то еще ;-)))


Да это не совсем вопрос религии, это теор. вопрос - хотите, что бы у вас хранились избыточные данные, пожайлуста делайте составной ключ, особенно это будет заметно, если у вас на эту таблицу ссылаются более 2ух таблиц.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32441980
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 bas\r
Избыточные данные - это как раз введение суррогатного ключа\r
А уж использование (для ссылок) суррогатного ключа вместо естественного - легко может привести к нежелательным артефактам. Вспомни топик Нормальные формы - там именно использование составного ключа (в таблице IDXS) избавляло от артефактов, имеющим место быть при нарушениях 4НФ\r
\r
Так что это действительно вопрос не религии, а теории. Если с таблицей связей нет и не будет - да хоть какой ключ. Если связи есть - уже надо смотреть, что это за связи такие.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32442149
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А уж использование (для ссылок) суррогатного ключа вместо естественного - легко может привести к нежелательным артефактам. Вспомни топик Нормальные формы - там именно использование составного ключа (в таблице IDXS) избавляло от артефактов, имеющим место быть при нарушениях 4НФ


Не хочется вспоминать - слишком много пришлось писать....
В том топике шла речь о сурогатном ключе(ссылки) из одной таблицы, что как раз получиться если таблица будет ссылаться на таблицу-связку по составному ключу, т.е.
t1(t1_id), t2(t2_id)
t3(t1_id, t2_id)
t4(t4_id, t1_id, t2_id, text) -- вот это уже нарушение как раз получается, если следовать тому топику

а если сделать так:
t1(t1_id), t2(t2_id)
t3(t3_id, t1_id, t2_id)
t4(t4_id, t3_id, text) -- то все нормально
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32442247
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так...
Все это весьма спорно. Мне думается, что применительно к данному топику не следует забывать еще про unique index(UserID, RoleID).

если сделать так:
t1(t1_id), t2(t2_id)
t3(t3_id, t1_id, t2_id)
t4(t4_id, t3_id, text) -- то все нормально
Если t4 зависит от t3, то получается, что t3 - самоценная сущность, и у нее должен быть собственный ключ... С другой стороны, если t3 не рассматривается как самостоятельная сущность, а служит только своей единственной цели обеспечить M:M...

t1(t1_id), t2(t2_id)
t3(t1_id, t2_id)
t4(t4_id, t1_id, t2_id, text) -- вот это уже нарушение как раз получается, если следовать тому топику - то это все построение или вырождается в
t1(t1_id), t2(t2_id)
t3(t1_id, t2_id, text)
или же t4 можно рассматривать как не зависимую от t3 сущность, которая существует наравне с t3 и, кстати, если есть t4_unique_index(t1_id, t2_id), вырождается в t3-подобие. ;-) Так же завися (или завиша ;-))) только от t1 и t2.
С другой стороны, действительно, в процессе проектирования t3-подобные таблицы имеют неприятное свойство "внезапно" становиться самостоятельными сущностями, поэтому себе дешевле заранее запланировать суррогатный ключ типа t3_id. Вот и вся религия.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32442283
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 bas
авторt4(t4_id, t1_id, t2_id, text) -- вот это уже нарушение как раз получается, если следовать тому топику
Откуда нарушение???????? Исходя из чего?
если бы было
Код: plaintext
1.
2.
3.
4.
t1(t1_id)
t2(t2_id)
t3(t3_id, t1_id, t2_id) - связи с t1 и t2
t4(t4_id, t1_id)        - связь с t1
t5(t4_id, t1_id, t3_id) - связь с t4 по t4_id, t1_id и с t3 по t3_id

то было бы нарушение в t5 - при условии, что в t5 ссылка на t3 должна относится к тому же самому t1.
если такого условия нет - то нарушения нихт. можно ссылаться по чему угодно.
если условие есть - то дефект лечится именно структурой t5(t4_id, t1_id, t2_id) со связями c t4 по t4_id, t1_id и с t3 по t1_id, t2_id. и в этом случае t3_id не нужен, бесполезен и вреден. Запланировать его можно, а использовать для ссылок - нельзя.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32442446
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ЛП
t5(t4_id, t1_id, t3_id)

Так... А так делать не надо. С самого начала видно, что если t5 зависит от t3, то она уже зависит и от t1.
(Если вспомнить топик про нормализацию, получается, что если поля в индексе зависят от суррогатного ключа индекса, то это автоматом делает их связанными с таблицей, на которой этот индекс (и тогда вязать с t1 не надо), а если, как в том топике, ключ был не суррогатный, то указанного построения здесь и не возникает ;-)).
Вообще говоря, теорию мне тоже надо бы перечитать, но использовать суррогатные ключи я вряд ли перестану - даже если тем самым и буду рисковать нарушить 4НФ ;-)
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32442466
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С самого начала видно, что если t5 зависит от t3, то она уже зависит и от t1
Да вот как раз не видно.
Ссылки на t3 и t1 - могут быть независимыми аттрибутами t5. А могут быть и зависимыми.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32442502
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас нет время (и охоты) писать много и убеждать, как должно быть по теории (может я в чем и сам не прав)....
ЛП, ты говоришь что всегда надо ссылаться по сурогатному ключу, но а если есть такая структура, ты то же все по составному ключу будешь делать???
Код: plaintext
1.
2.
3.
4.
5.
6.
t1(t1_id)               t3(t3_id)
 |   t2(t2_id)           |   t4(t4_id) 
 |     |                 |      |
 t5(t1_id, t2_id)      t6(t3_id, t4_id)
     |                       |    
   t7(t1_id, t2_id, t3_id, t4_id)
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32442910
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 bas
ЛП, ты говоришь что всегда надо ссылаться по сурогатному ключу
матьматьмать
факфакфак
епт
слов нет, одни эмоции остались

Я НЕ ГОВОРЮ ЧТО НАДО ССЫЛАТЬСЯ ПО СУРОГАТНОМУ КЛЮЧУ !!!
я говорю как раз наоборот

матьматьмать
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32443180
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛПЯ НЕ ГОВОРЮ ЧТО НАДО ССЫЛАТЬСЯ ПО СУРОГАТНОМУ КЛЮЧУ !!
bas...ты говоришь что всегда надо ссылаться по сурогатному ключу...
Извиняюсь, по естесвенному ключу имелось ввиду....

Вот статья на эту тему, немного не наш случай, но объясняют, почуму надо использовать сурогатн. ключ и в чем его приемущества, так же сдесь интересен вопрос про НФ:
Естественные ключи против искусственных ключей
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32443503
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 bas
Твоей бы ссылкой - да разработчиков аксапты по харе
А то эти уроды все идентификаторы хранят в текстовых полях. Причем даже если это число - приводят к тексту и хранят как текст. И естественные ключи используют, так что переименование единицы измерения вызывает каскадное обновление всех таблиц. Руки оборвать по самую жопу.

Но статья мало относится к теме обсуждения. Против таких суррогатных ключей - нечего возразить.
А вот заменять составной первичный ключ суррогатным - это бред имхо.
Мне вот в наследство база досталась, так ее разработчик видать эту статью прочитал и воспринял как руководство к действию. Научи дурака богу молиться... Пять таблиц, последовательно связанные отношениями один-ко-многим - и везде ключи-счетчики... Поубивал бы.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32443544
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Но и всегда использовать только составные ключи - тоже бред. У меня вон недавно в подобной связке (t1_id, t2_id) одно поле стало необязятельным. Использовал бы составной ключ для связи - была бы развлекуха.
В общем эта... По ситуации смотреть надо.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32443718
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛП,
ладно закончим на этом, главное, на что я надеюсь, что автор понял, что в его случае не нужен сурогатный ключ.
А мы с тобой и так знаем как и что в каких ситуациях делать и спорить из-за неодназначной ситуации и раздувать флейм на 10 страниц нет времени...
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32444239
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bas&Urri правы - несоставной (именно несоставной - суррогатным он быть не обязан) ключ имеет смысл ввести если эта таблица не просто реализует связь - но, так же, соответствует какой-то сущности в системе.

ЛП
Про разработчиков Axapt'ы - смешно...
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32447642
Романыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вся фигня в том, что у меня в базе везде такие синтетические ключи - счетчики.
В итоге Order - OrderLine связаны только через FK и строки заказа нумеруются насквозь через Identity.
Я объяснить не смог, что это бред :-(
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32447652
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому объяснить не смог???
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32447685
f2f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
f2f
Гость
2 Романыч

Вся фигня в том, что у меня в базе везде такие синтетические ключи - счетчики.
В итоге Order - OrderLine связаны только через FK и строки заказа нумеруются насквозь через Identity.
Я объяснить не смог, что это бред :-(


Я тоже не понимаю почему это бред - поясни
Понимаю, что можно делать по разному, но почему бред ?
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32447762
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
угу, мне тоже объясните пожалуйста - где бред?
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32447934
bas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще бред - какое-то не научное слово, это что-то уже из философии :))

А автор, наверное, имел ввиду, что у него везде в БД есть сурогатный ключ для связующих таблиц, что естесвенно для простых связок нельзя делать.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32447965
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я выше приводил пример, как мне досталась база с пятью такими связанными таблицами. Вот весело то - имея запись из "нижней" таблицы узнавать идентификатор связанной "верхней". Приходится для этого 4 лишних джойна делать
У Романыча 2 таблицы, такой гемор ему не грозит, но подход все равно неправильный.
Для строк состава документа ссылка на шапку документа - не есть неключевой аттрибут, а есть часть первичного ключа. Потому как вряд ли автор оперирует такими понятиями, как "строка ХХХ какого-то документа, неважно какого "
funikovyuriнесоставной ключ имеет смысл ввести если эта таблица не просто реализует связь - но, так же, соответствует какой-то сущности в системе
Вот и здесь. Описываемая сущность - это не просто висящая в воздухе строка, а строка определенного документа. И первичный ключ должен это отражать.
ИМХО.
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32448016
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так у него же там ORDER->ORDER_LINE - это не many-to-many
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32448509
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это не many-to-many
Ну так тем более
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32448775
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что: этот пример прекрасно ложится на определение, данное нами с funikovyuri.
несоставной ключ имеет смысл ввести если эта таблица не просто реализует связь - но, так же, соответствует какой-то сущности в системе С поправкой: наверное, все же не в системе, а в реальном мире. Строка заказа сама по себе не соответствует какой-то сущности реального мира (ибо без заголовка заказа смысла не имеет). Поэтому можно не вводить несоставной ключ.
С другой стороны, на строку заказа может ссылаться строка оплаты, например (представим, что каждую строку закрывают отдельной оплатой). В этом случае несоставной ключ уже смысл имеет.
В двух последних КИС, с которыми мне довелось работать (в одной и той же компании, кстати) были применены разные подходы, и они работали по-разному (то, что делалось быстро в первой КИС, происходило с большим количеством join'ов - и медленнее - во второй, зато вторая работала быстрее в других случаях).

Ну, то есть мы рассматриваем вопрос не совсем религии, как я раньше выразился, а скорее вопрос выбора с учетом преобладания в системе одних задач над другими, оптимизации, так сказать ;-)
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32448827
f2f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
f2f
Гость
Ну, то есть мы рассматриваем вопрос не совсем религии, как я раньше выразился, а скорее вопрос выбора с учетом преобладания в системе одних задач над другими, оптимизации, так сказать ;-)

Ну так я и писал можно делать по разному, но почему бред ?
...
Рейтинг: 0 / 0
Синтетический ключ для таблицы many-to-many
    #32448857
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Urri
С другой стороны, на строку заказа может ссылаться строка оплаты, например (представим, что каждую строку закрывают отдельной оплатой). В этом случае несоставной ключ уже смысл имеет.
И в этом случае тоже - строка оплаты ссылается не на абстрактную строку заказа (в воздухе висящую), а на конкретную строку конкретного заказа.
Представь себе (гипотетическое) ограничение, что оплата может закрывать строки одного заказа - и тут же без идентификатора заказа в первичном ключе строки становиться грустновато...

2 f2f
Ну так я и писал можно делать по разному, но почему бред ?
Ни одна из известных мне моделей документов не оперирует строками документа "самими-по-себе", только строками как частью документа.
Строка документа - не независимая сущность. Она - очень даже зависимая сущность. Поэтому такой ключ - бред. Если конечно не рассматривать случаи сферических коней в вакууме.
З.Ы. Имхо
З.З.Ы. А мне с таким бредом работать приходится. Поубивал бы
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Синтетический ключ для таблицы many-to-many
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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