powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / какой вариант связывающей таблицы многие-ко-многим предпочтительнее
25 сообщений из 33, страница 1 из 2
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38935463
Вот нужно сделать таблицу, связывающую две другие в отношении многие-ко-многим, скажем People(PeopleID, ...) и Bank(BankID, ...)

Можно сделать так:
PeopleBank(PeopleID, BankID, primary clustered key (PeopleID, BankID)) + индекс (BankID, PeopleID)

а можно так:
PeopleBank(ID, PeopleID, BankID, primary clustered key (ID)) + 2 индекса, (PeopleID, BankID) и (BankID, PeopleID)

вот какой способ предпочтительнее?

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

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38935530
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В варианте с ПК из одного ID дает выигрыш на стыке разработки клиента и сервера. Можно использовать универсальные приемы, механизмы, рассчитанные всегда на использование одного длинного целого айди для любой таблицы. Удобнее разрешать некоторые проблемы с данными, когда при неизменном ID в записи можно поменять одно или другое поле. В общем есть очень много практических резонов, которые проявляются при разработке приложений целиком, под ключ. По отдельности любой вопрос можно решить и через два поля, но по совокупности удобств работы с одним ID набирается "критическая масса". В итоге я всегда использую ПК автосчетчики или из одного ID.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38935710
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС оцените будут ли у вас обращения к данной таблице по ID (читай иные связанные сущности)?
Или будут преобладать операции поиска Человека по Банку и Банка по человеку?

В зависимости от этого выбирайте один из двух обозначенных вариантов.
Просто индекс ради индекса по ID - не вижу смысла создавать.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38935881
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой вариант связывающей таблицы многие-ко-многим предпочтительнее

Вообще-то такой вариант только один -- связывающая таблица.


таблица многие-ко-многимВот нужно сделать таблицу, связывающую две другие в отношении многие-ко-многим, скажем People(PeopleID, ...) и Bank(BankID, ...)

Можно сделать так:
PeopleBank(PeopleID, BankID, primary clustered key (PeopleID, BankID)) + индекс (BankID, PeopleID)

а можно так:
PeopleBank(ID, PeopleID, BankID, primary clustered key (ID)) + 2 индекса, (PeopleID, BankID) и (BankID, PeopleID)

вот какой способ предпочтительнее?


Это один и тот же вариант.

Поле ID там нужно только в случае, если связь выступает как самостоятельная сущность, у неё как правило есть атрибуты (но не обязательно), и на неё есть ссылки из других таблиц, ИЛИ наличия несоставного PK требует какое-то специфическое клиентское программное обеспечение.

Это всё бывает очень и очень редко , и в 90% случаев никакой суррогатный ID для связи не нужен.
Кроме этого, он вреден, поскольку занимает место, и без него всегда можно обойтись .
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38935885
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П-ЛВ варианте с ПК из одного ID дает выигрыш на стыке разработки клиента и сервера.

Ничего он не даёт. Нет выигрыша. Другое дело, если у тебя на клиенте работает какой-то недоделанный самописанный ORM без поддержки составных ключей, ну, тогда -- да, никуда не деться.

Нормальные ORM типа Hibernate поддерживают составные ключи.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38935903
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто всё бывает очень и очень редко , и в 90% случаев никакой суррогатный ID для связи не нужен.
Кроме этого, он вреден, поскольку занимает место, и без него всегда можно обойтись .

ТС же привел причину, для чего нужно поле ID.
Возможно, второй вариант предпочтительнее в высоконагруженных системах, когда вставлять записей нужно много и часто.

Да, редко бывает так, что стоимость вставки в связующую таблицу значительно важнее стоимости выборки из нее - но это возможно .
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38936162
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинТС же привел причину, для чего нужно поле ID.
Возможно, второй вариант предпочтительнее в высоконагруженных системах, когда вставлять записей нужно много и часто.



Это не причина, это -- предположение.
И к тому же беспочвенное.

С какого это вставка в таблицу с тремя полями и тремя индексами должна быть быстрее, чем вставка в таблицу с двумя полями и двумя индексами ?
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38936213
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблица многие-ко-многими вот интересно, почемуПричина не техническая, а человеческая - пусть безобразно, но единообразно.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38936264
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблица многие-ко-многима можно так:
PeopleBank(ID, PeopleID, BankID, primary clustered key (ID)) + 2 индекса, (PeopleID, BankID) и (BankID, PeopleID)

вот какой способ предпочтительнее?

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

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

MasterZiv....
Это всё бывает очень и очень редко , и в 90% случаев никакой суррогатный ID для связи не нужен.
Кроме этого, он вреден, поскольку занимает место, и без него всегда можно обойтись .
Тут получается in depends от практики, опыта и предметной области

Все что могу вспомнить и представить из реальных задач, скорее склонялось бы к применению суррогатного ключа. IMHO Ну и при проектировании системы лучше поддерживаться единообразия. Т.ч. если половина таблиц "красивее" с суррогатным ключем, то и остальную половину делаем так же и не паримся IMHO.

А насчет вреден... это сильно сказано... когда в ключе начинают попадать реальные данные и они меняются, в сопровождении можно не хилый гемор схватить. IMHO
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38936623
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Leonid Kudryavtsev
Во втором варианте, можно добавить в таблицу PeopleBank дополнительные поля, например AccountNumber (номер счета в данном банке) и особо ничего переделывать не придется )))

в обоих можно добавлять.


"Чистую связь" (без доп данных на связке) NN встречал очень редко.

странно, а я -наоборот очень часто.



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


это не технический критерий.
технический - суррогатный ключь - лишние 4 - 8 тут на запись.

MasterZiv....
Это всё бывает очень и очень редко , и в 90% случаев никакой суррогатный ID для связи не нужен.
Кроме этого, он вреден, поскольку занимает место, и без него всегда можно обойтись .
Тут получается in depends от практики, опыта и предметной области

Все что могу вспомнить и представить из реальных задач, скорее склонялось бы к применению суррогатного ключа. IMHO Ну и при проектировании системы лучше поддерживаться единообразия. Т.ч. если половина таблиц "красивее" с суррогатным ключем, то и остальную половину делаем так же и не паримся IMHO.


опять не технический поход.
по мне - хранить лишние никому не нужные данные -это уродство.


А насчет вреден... это сильно сказано... когда в ключе начинают попадать реальные данные и они меняются, в сопровождении можно не хилый гемор схватить. IMHO

ключи никогда не меняются. и тут они не должны меняться в обоих случаях.

и еще раз - если ты вводишь лишнюю, не нужную, колонку, то ты должен это как то оправдать.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38936704
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВсе что могу вспомнить и представить из реальных задач, скорее склонялось бы к применению суррогатного ключа . IMHO Ну и при проектировании системы лучше поддерживаться единообразия. Т.ч. если половина таблиц "красивее" с суррогатным ключем, то и остальную половину делаем так же и не паримся IMHO.

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

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

еще раз подчеркиваю, это доводы в стиле "я так хочу", "мне так нравится".
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38937486
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, связывающая таблица, она и есть " просто таблица ".

Что лучше составной ключ или суррогатный - думаю в форумах можно кучу флейма по данному вопросу найти и почитать.

"Чистую" связку N:N вижу очень редко (вот вообще даже и не вспомнить, когда и зачем такое требовалось). В любом случае, там есть еще какие нибудь поля.

И если "сферический" пример топик-стартера, действительно как бы 100% за составной ключ, то даже простейшее его усложнение (например добавить поле accountNumber) начинает приводить к гемору при отсутствия суррогатного ключа.

Пусть это список счетов, по которому мы ведем расчеты с клиентом. Добавили мы поле accountNumber. Понятно, что ключа PeopleID, BankID уже не достаточно, т.к. в банке можно иметь много счетов (у меня в банке Санкт-Петербруг аж 4 штуку + кредит /счетом почему-то не считается))) / ). Все, редактируемое пользователем поле accountNumber попало в ключ и может меняться. Т.е. нарушение декларируемого Вами принципа.
MasterZivключи никогда не меняются. и тут они не должны меняться в обоих случаях.


Даже больше того, и со "сферической" таблицей всего с двумя полями (PeopleId,BankId), при реализации интерфейса (юзер френдли))) ) можно получить ситуацию "меняется ключ".
MasterZivеще раз подчеркиваю, это доводы в стиле "я так хочу", "мне так нравится".

Полностью согласен. А разве этого мало? ))) На мой взгляд это вполне достаточный довод.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38937515
Фотография Dogen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevДобавили мы поле accountNumber. Понятно, что ключа PeopleID, BankID уже не достаточно
Скорее, вместо BankId теперь AccountId.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38937529
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо смотреть предметную область. У топик стартера сферическая табличка и сферический вопрос. А в реальной жизни "все не так очевидно" ( C ) дочь офицера
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38937735
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблица многие-ко-многимвот какой способ предпочтительнее?
В оракловой практике первый способ в целом предпочтительнее. Второй, пожалуй, имеет смысл тогда и только тогда, когда развязочная таблица обрастает атрибутами и в целом превращается в полноценную сущность. Особенно - когда уже к ней появляются дочерние (ссылающиеся на неё) таблицы.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38937927
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DogenLeonid KudryavtsevДобавили мы поле accountNumber. Понятно, что ключа PeopleID, BankID уже не достаточно
Скорее, вместо BankId теперь AccountId.
Мне кажется, что если привязать к PeopleID поле AccountID, то тут велика вероятность изменения связи на 1:N (что-то есть сомнения, что в банках к одному счёту имеют доступ несколько пользователей), то есть тема топика изменилась.

P.S. Хотя правильно заметили ранее, в другой предметной области (не банковской) может быть всё по-другому.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38937946
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.FontaineDogenпропущено...

Скорее, вместо BankId теперь AccountId.
Мне кажется, что если привязать к PeopleID поле AccountID, то тут велика вероятность изменения связи на 1:N (что-то есть сомнения, что в банках к одному счёту имеют доступ несколько пользователей), то есть тема топика изменилась.

P.S. Хотя правильно заметили ранее, в другой предметной области (не банковской) может быть всё по-другому.Корпоративные счета, либо дубликат для жены, ребенка.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38938018
Фотография Dogen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.FontaineDogenпропущено...

Скорее, вместо BankId теперь AccountId.
Мне кажется, что если привязать к PeopleID поле AccountID, то тут велика вероятность изменения связи на 1:N (что-то есть сомнения, что в банках к одному счёту имеют доступ несколько пользователей), то есть тема топика изменилась.

P.S. Хотя правильно заметили ранее, в другой предметной области (не банковской) может быть всё по-другому.
Угу. Но. Если много банков остается, то получается нормализованная схема, где человек вяжется к банку через аккаунт. AccountId и есть то, что связывает PeopleId с BankId m:n

Но вообще это бессодержательное обсуждение уже.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38940206
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблица многие-ко-многимВот нужно сделать таблицу, связывающую две другие в отношении многие-ко-многим, скажем People(PeopleID, ...) и Bank(BankID, ...)

Можно сделать так:
PeopleBank(PeopleID, BankID, primary clustered key (PeopleID, BankID)) + индекс (BankID, PeopleID)

а можно так:
PeopleBank(ID, PeopleID, BankID, primary clustered key (ID)) + 2 индекса, (PeopleID, BankID) и (BankID, PeopleID)

вот какой способ предпочтительнее?

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

Модератор: Тема перенесена из форума "Microsoft SQL Server".
Если бы Вы были знакомы с теорией баз данных, то знали бы, что "способы" происходят от использования, в данном случае, реляционной модели данных, в которой связи между типами сущностей не поддерживаются. Тем не менее, если строго следовать теории баз данных (то есть, учитывать, что у связей не может быть свойств, связи всегда бинарные и всегда двухсторонние), то оба Ваши способа не верны. Верным будет создавать две "таблицы" на каждую связь (причем, независимо от мощности связи). В Вашем примере, это выглядит в "реляционной системе" примерно так:

PeopleBank(PeopleID, BankID, primary clustered key (PeopleID, BankID))
BankPeople(BankID, PeopleID, primary clustered key (BankID, PeopleID))
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38940548
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv

Поле ID там нужно только в случае, если связь выступает как самостоятельная сущность, ...
Все же, скорей всего, если кто-то захочет считать связь сущностью - это его дело при толковании МД.
А ID может дать пользу из-за того, что не меняется. Остальные поля могут меняться, что может привести к траблам при программировании, если надо найти какая запись менялась (что было до изменения). Сталкивался на практике. А так есть ID и не о чем париться. Кроме того, единообразие: у все таблиц есть ID. Одинаковый стиль при работе со всеми без относительно модели.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38940625
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoА ID может дать пользу из-за того, что не меняется. Остальные поля могут меняться, что может привести к траблам при программировании, если надо найти какая запись менялась (что было до изменения).

Это как раз проще разрулить тем, что для элементов связующей таблицы (во всяком случае - для ключевых полей) не определена операция "изменение" - только "добавление" и "удаление". Действительно, что логически понимается под "связь банка и человека изменилась" - слабо понятно. "Связь с одним банком перестала действовать, связь с другим банком - начала действовать" - это да, понятно.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38940650
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинЭто как раз проще разрулить тем, что для элементов связующей таблицы (во всяком случае - для ключевых полей) не определена операция "изменение" - только "добавление" и "удаление". Действительно, что логически понимается под "связь банка и человека изменилась" - слабо понятно. "Связь с одним банком перестала действовать, связь с другим банком - начала действовать" - это да, понятно.
С одной стороны в БД всегда как "изменение" присуще. Как там м почему меняются связи в БД зависит от реализации проги. Зачем мне проетировщику БД думать как пишет прогу проггер. Он поменял в проге ид банка и человов массово, а другой части проги ему надо знать в каком каждый был до изменения. У меня есть ID и я легко отвечу на этот вопрос. Мое дело предоставлять требуемую инфу как можно проще, а не говорить ему как программировать.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38940690
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo Мое дело предоставлять требуемую инфу как можно проще, а не говорить ему как программировать.

Не совсем так - иначе можно сказать "ну да, поменял я в базе что-то хекс-редактором - ну-ка дай мне инфу, чо как было до этого?"
База предоставляет прикладному программисту интерфейсы - "применишь такую-то операцию с такими-то параметрами - получишь такой-то результат". Имхо лучше, чтобы в интерфейсе не было метода "изменить связь банка и человека", были методы "добавить связь" и "удалить связь".
Информация, что связь "Петров-ВТБ" была раньше связью "Иванов-Сбер" - бессмысленна с точки зрения предметной области (примерно настолько же, насколько информация что блок данных, который сейчас занимает запись с этой связью, раньше был выделен под блоб со сканом договора ), поэтому не нужно и вредно предоставлять эти данные прикладному программисту.
Получить список удаленных связей [за период]? Пожалуйста.
Получить список добавленных связей [за период]? Пожалуйста.
Получить информацию, какая добавленная связь "была" какой удаленной? - извините, такой информации нет и не будет.
...
Рейтинг: 0 / 0
какой вариант связывающей таблицы многие-ко-многим предпочтительнее
    #38940813
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин
Не совсем так - иначе можно сказать "ну да, поменял я в базе что-то хекс-редактором - ну-ка дай мне инфу, чо как было до этого?"
База предоставляет прикладному программисту интерфейсы - "применишь такую-то операцию с такими-то параметрами - получишь такой-то результат". Имхо лучше, чтобы в интерфейсе не было метода "изменить связь банка и человека", были методы "добавить связь" и "удалить связь".
Информация, что связь "Петров-ВТБ" была раньше связью "Иванов-Сбер" - бессмысленна с точки зрения предметной области (примерно настолько же, насколько информация что блок данных, который сейчас занимает запись с этой связью, раньше был выделен под блоб со сканом договора ), поэтому не нужно и вредно предоставлять эти данные прикладному программисту.
Получить список удаленных связей [за период]? Пожалуйста.
Получить список добавленных связей [за период]? Пожалуйста.
Получить информацию, какая добавленная связь "была" какой удаленной? - извините, такой информации нет и не будет.
Не хекс-редактором. А в коде. Одна ф-я меняет поля. А другая в той же транзакции еще что-то меняет, но на основе, того, что раньше было в измененной записи. Я просто не помню примера, но ситуация была на практике. Проггер сказал, что он чего-то не может сделать что-то из-за того, что не знает что было до изменения. Потому пришлось добавлять ID. И мне и не должно быть дело до интерфейсов. Он спросил как узнать что было до изменения, я ответил. БД моя, а все остальное (каким должен быть интерфейс не мое). Разделение труда.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / какой вариант связывающей таблицы многие-ко-многим предпочтительнее
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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