Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Добрый день. В умных книгах советуют... если обнаруживается связь "многие ко многим" между таблицами вводить дополнительную табл. связки и связывать через неё по "один ко многим". Подскажите что при этом мы выигрываем...? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 12:46 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Сугубо мое мнение. Что значит если нашли? вопрос исходит от задачи, если нужно сделать такую таблицу - то брать ее и делать. Конечно можно разделить ее на 2 или 3 штуки. Но тут стоит узнать как работает сервер с таблицами. Некоторые сервера быстрее отбрабатывают 1 таблицу по индексам, нежели связку нескольких по индексам. Поэтому такое утверждение как аксиома не корректно. Нужно смотреть конкретный случай. На практике таблицы многие-ко-многим делаю, если это наиболее оптимальное решение в проектировании и до сих пор в этом не разочаровался. Что вы от этого выиграете? Можно выиграть немного в быстродействии, а можно и проиграть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 12:52 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Сервер MSSQL2K. Есть табл. "Клиенты" и "Адреса". У одного клиента может быть много адресов и на одном адресе может быть зарегистрированно много клиентов... Вопрос: как лучше... оставить две эти табл. и связать по "Клиент.id" и тогда в табл. "Адреса" будут множественные записи по клиенту либо создать табл. связки где будут только id-шники клиентов и адресов правда тоже множественные записи и не очень понятно в чём выигрыш...?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 13:03 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Дедушка Подскажите что при этом мы выигрываем...? В основном то, что связь "многие ко многим" обычно не поддерживается напрямую механикой сервера БД и приходится использовать тот или иной трюк.Таблица развязки - наиболее популярный из таких трюков и пожалуй наиболее корректный с точки зрения "духа реляционной теории". ДедушкаЕсть табл. "Клиенты" и "Адреса". У одного клиента может быть много адресов и на одном адресе может быть зарегистрированно много клиентов... Вопрос: как лучше... оставить две эти табл. и связать по "Клиент.id" и тогда в табл. "Адреса" будут множественные записи по клиенту Если Вы свяжете их по "Клиент.id", в таблице "Адреса" не будет "много клиентов на одном адресе" - если меня не глючит и MSSQL еще не научился делать массивов в полях. Будут "много клиентов на совпадающих адресах". Дедушкалибо создать табл. связки где будут только id-шники клиентов и адресов правда тоже множественные записи и не очень понятно в чём выигрыш...?? Относительно скорости, как справедливо заметил Валентин, вопрос неоднозначный. Выигрыш, я бы сказал, в простоте и универсальности такой структуры - она легко воспринимается, к ней легко писать любые запросы, чаще всего она достаточно эффективна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 13:21 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Дедушка... в табл. "Адреса" будут множественные записи по клиенту... Как вы это собираетесь сделать ? В табл. "Адреса" завести текстовое поле "Список Клиентов" и записывать в него id клиентов через запятую ? Недостатков такого подхода достаточно. 1. Как выяснить адрес клиента, зная его id ? select IdCli from address where my_func(IdCli)=1 (в данном примере функция my_func возвращает 1 если в поле "Список Клиентов" есть id данного клиента, и 0 - если его там нет) полный просмотр таблицы адресов с вызовом функции my_func для каждой записи (я не знаю можно или нет строить идекс по функции в MSSQL2K) 2. Нельзя организовать ссылоную целосность. 2.1. В поле "Список Клиентов" можно добавить id несуществующего клиента (или писать триггер). 2.2. При удалении клиента необходимо пройтись по всей таблице "Адреса" и обновлять все поля "Список Клиентов" где присутствует данный id клиента. 2.3. При удалении записи из "Адреса" необходимо опять же обеспечить сохранение ссылочной целосности (чтобы не получить клиентов без адреса). При создании таблицы связей и foreign key - всех этих проблем просто не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 13:25 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Афтор темы - ответьте пож-ста на следующий вопрос. Какие отрицательнае факторы вы видите в создании таблицы многие-ко-многим, поддержании целостности данных и работе с этой таблицей? Какие вы ожидаете положительные качества от разделения этой таблицы? Это вопросы на уровне концепции реализации этого кусочка предметной области. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 13:30 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Дедушка Добрый день. В умных книгах советуют... если обнаруживается связь "многие ко многим" между таблицами вводить дополнительную табл. связки и связывать через неё по "один ко многим". Подскажите что при этом мы выигрываем...? Спасибо. Попробуйте сначала найти как минимум еще одно решение, а потом уже определять, что выигрываем/проигрывеам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 13:38 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Если использовать пример с табл-ми "Клиенты" и "Адреса" то конечно связь многие к многим реализуется как множественные записи т.е для разных Клиент.id повторяется один Адрес... Тогда желая получить все адреса клиента мы делаем выборку из "Адреса" по конкретному Клиент.id и получаем список адресов клиента, обратно работает для получения всех клиентов с этим адресом... Во многих толстых книгах по построению БД советуют такие сущности разделять через табл. связки, но ни где толком не объясняется почему?? Вчём проблема при такой организации БД (с нормализацией что ли...)?? Этот вопрос для меня тёмный поэтому и спрашиваю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 14:10 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Напишите пример. Код: plaintext 1. 2. 3. 4. 5. 6. и так чтобы был адрес для по которому находиться один клиент и адрес по которому находиться три клиента. И select-ы которыми вы получаете Дедушка...желая получить все адреса клиента мы делаем выборку из "Адреса" по конкретному Клиент.id и получаем список адресов клиента, обратно работает для получения всех клиентов с этим адресом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 14:33 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Ну условно... Клиенты: Клиент_ид Имя Адрес: Адрес_ид Клиент_ид Город Адрес1 Пример: Клиенты: 1*****Путин 2*****Иванов Адрес: 1*****1*****Москва*****Кремль 2*****1*****Моск.обл.*****Борвиха 3*****2*****Москва*****Кремль 4*****2*****Моск.обл.*****Борвиха Запрос получить все адреса Путина: select Клиент.Имя, Адрес.Город, Адрес.Адрес1 from Адрес left outer join Клиент on Адрес.Адрес_ид=Клиент.Адрес_ид where Клиент.Имя='Путин' В другую сторону получить имена всех клиентов проживающих в кремле: select Клиент.Имя, Адрес.Город, Адрес.Адрес1 from Клиент left outer join Адрес on Клиент.Адрес_ид=Адрес.Адрес_ид where Адрес.Адрес1='Кремль' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 15:01 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
zayacНапишите пример. Код: plaintext 1. 2. 3. 4. 5. 6. и так чтобы был адрес для по которому находиться один клиент и адрес по которому находиться три клиента. И select-ы которыми вы получаете [/quot] Главное - Адрес, по которому пока нет ни одного Клиента и Клиента, чей Адрес не известен. Независимое существование адресов и клиентов и обеспечивается сущностью АдресКлиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 15:05 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
В предыдущем очепятка... :) Связка по Клиент_ид. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 15:07 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Дедушка Ну условно... Адрес: Адрес_ид Клиент_ид Город Адрес1 Адрес: 1*****1*****Москва*****Кремль 2*****1*****Моск.обл.*****Борвиха 3*****2*****Москва*****Кремль 4*****2*****Моск.обл.*****Борвиха Вот в этом и вопрос - является ли Адрес у нас самостоятельной сущностью? В вашем примере нет - таблицу правильнее назвать АдресКлиента. А собственно Адрес без привязки к Клиенту отсутствует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 15:15 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
ModelR Главное - Адрес, по которому пока нет ни одного Клиента и Клиента, чей Адрес не известен. Независимое существование адресов и клиентов и обеспечивается сущностью АдресКлиента. В данной системе не предполагается Клиента без адреса и Адреса без клиента... Т.е разделение связи многие ко многим через табл. связи актуально если необходимо независимость сущностей Клиент и Адрес?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 15:18 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Мне казалось, что грабли в чём то другом... Ну вот пример из pubs-а где табл. "Авторы" и "Названия книг". Везде говорится, что это многие ко многим и поэтому будем разделять через связку. Хотя очевидно, что не будет авторов без книг и книг без авторов... Вот и вопрос ПОЧЕМУ ПОЭТОМУ ...?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 15:22 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
У вас неправильное представление о практической реализации связи "многие ко многим". Тут явно видна избыточность. Адрес: 1*****1*****Москва*****Кремль 2*****1*****Моск.обл.*****Борвиха 3*****2*****Москва*****Кремль 4*****2*****Моск.обл.*****Борвиха (Кстати, почему у [Моск.обл.*****Борвиха] два различных Адрес_ид - 2 и 4 ?) Если будет 1000 клиентов из Борвихи надо будет писать (согласно вашему примеру): 2*****1*****Моск.обл.*****Борвиха 4*****2*****Моск.обл.*****Борвиха 5*****3*****Моск.обл.*****Борвиха .............. 1001*****1000*****Моск.обл.*****Борвиха а в таблице Адрес кроме полей Город,Адрес1 может быть еще штук 30 полей. В таблице Адрес должна быть только одна запись [Моск.обл.*****Борвиха] Причем еще и второй пример нерабочий. select Клиент.Имя, Адрес.Город, Адрес.Адрес1 from Клиент left outer join Адрес on Клиент.Адрес_ид=Адрес.Адрес_ид where Адрес.Адрес1='Кремль' В таблице Клиент у вас нет поля Адрес_ид. Если вы его туда вставите то получиться (опять же следуя вашей логике): 1*****1*****Путин 2*****1*****Иванов 3*****2*****Путин 4*****2*****Иванов тоже самое что и с адресами. Должно быть: Клиенты: 1*****Путин 2*****Иванов Адрес: 1*****Москва*****Кремль 2*****Моск.обл.*****Борвиха Связь_Адрес_Клиент: Адрес_ид Клиент_ид Наполнение: 1*****1 1*****2 2*****1 2*****2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 15:30 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
ДедушкаВ данной системе не предполагается Клиента без адреса и Адреса без клиента... Т.е разделение связи многие ко многим через табл. связи актуально если необходимо независимость сущностей Клиент и Адрес?? ModelR сделал абсолютно верное замечание. Если удалить всех ваших клиентов из Борвихи - то и Борвиха прекратит свое существование. Если вы именно этого и добиваетесь - объединяйте таблицы "Адрес" и "Клиент". (Опять же - будет некоторая избыточность). ДедушкаНу вот пример из pubs-а где табл. "Авторы" и "Названия книг". Везде говорится, что это многие ко многим и поэтому будем разделять через связку. Хотя очевидно, что не будет авторов без книг и книг без авторов... Мне это не очевидно. Если у нас книжный склад - то имеем таблицу "Книга" в которой есть поля "Название книги" и "Автор". Потому что различных книг у которых один и тоже автор на книжном складе несколько штук. Но если мы говорим о библиотеке, в которой выделяются полки на конкретных авторов (классиков) - то уже имеет смысл говорить о разделении "Книга"/"Автор". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 15:44 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Дедушка Мне казалось, что грабли в чём то другом... Ну вот пример из pubs-а где табл. "Авторы" и "Названия книг". Везде говорится, что это многие ко многим и поэтому будем разделять через связку. Хотя очевидно, что и книг без авторов... Вот и вопрос ПОЧЕМУ ПОЭТОМУ ...?? "Никогда не говори никогда". Поверив, что не будет авторов без книг, сделаем информацию об авторе полями в Книге. Если мы удалим информацию про книгу, автор которой является автором единственно этой книги, то потеряем информацию про автора, а также про его адреса и т.д. А он возьмет и напишет еще, и придется снова его забивать. И еще, задачи меняются. Однажды обнаружится, что кроме авторства, человек нам интересен по другим основаниям (сотрудник, подрядчик, критик). Поэтому изначально разумно выделить человека как сущность: Человек ( ЧелИД, ФИО, ...), Книга (КнИД, Наименование,...) Авторство (ЧелИД,КнИД) Рецензирование (ЧелИД,КнИД) Именно об этих моментах обычно пишут в книгах.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 15:46 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
to: zayac Ну хорошо... но ведь в табл. "Связь_Адрес_Клиент" тоже множественные записи пусть 1000 клиентов из Борвихи тогда: 1*****1 . . . 1000*****1 И основная проблем в том, что в табл. "Адрес" есть ещё 30 полей... насколько я понял... но ведь поиск будет по индексу?? Т.е избыточность по айдишникам лучше чем по любым другим полям?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 15:50 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
ДедушкаТ.е избыточность по айдишникам лучше чем по любым другим полям?? Безусловно. Но помимо всего прочего, это не будет избыточностью; это будет как раз минимально необходимой записью соответствующего факта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 16:06 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
ModelR Дедушка Мне казалось, что грабли в чём то другом... Ну вот пример из pubs-а где табл. "Авторы" и "Названия книг". Везде говорится, что это многие ко многим и поэтому будем разделять через связку. Хотя очевидно, что и книг без авторов... Вот и вопрос ПОЧЕМУ ПОЭТОМУ ...?? "Никогда не говори никогда". Поверив, что не будет авторов без книг, сделаем информацию об авторе полями в Книге. Если мы удалим информацию про книгу, автор которой является автором единственно этой книги, то потеряем информацию про автора, а также про его адреса и т.д. А он возьмет и напишет еще, и придется снова его забивать. И еще, задачи меняются. Однажды обнаружится, что кроме авторства, человек нам интересен по другим основаниям (сотрудник, подрядчик, критик). Поэтому изначально разумно выделить человека как сущность: Человек ( ЧелИД, ФИО, ...), Книга (КнИД, Наименование,...) Авторство (ЧелИД,КнИД) Рецензирование (ЧелИД,КнИД) Именно об этих моментах обычно пишут в книгах.... Спасибо. Но при таком построении для занесения новой записи Автор-Книга нужно провести скан табл. Автор на предмет есть ли уже такой, затем скан табл. Книга собственно за тем же... и только потом произвести запись в табл. связку. При сущностях Клиент Адрес единственное "за" за введение табл. связки это то, что если город или улицу переименуют то изменять придётся только одну строку вместо скажем 100-ни... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 16:11 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Дедушка Но при таком построении для занесения новой записи Автор-Книга нужно провести скан табл. Автор на предмет есть ли уже такой, затем скан табл. Книга собственно за тем же... и только потом произвести запись в табл. связку. Допустим (хотя в данном случае это вряд ли окажется именно так). Только не скан таблицы, а скан индекса. Простенькая ХП из двух операторов MERGE и вставки в связку. Дедушка При сущностях Клиент Адрес единственное "за" за введение табл. связки это то, что если город или улицу переименуют то изменять придётся только одну строку вместо скажем 100-ни... Не единственное "за", но "решающее". Скажем, представьте себе запрос, который будет в Вашей схеме искать "подставные адреса", на которые зарегистрирована куча разных фирм. Вот это уж действительно будет перелопачивание абсолютно всей таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 16:30 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Дедушка Ну хорошо... но ведь в табл. "Связь_Адрес_Клиент" тоже множественные записи пусть 1000 клиентов из Борвихи тогда: 1*****1 . . . 1000*****1 И основная проблем в том, что в табл. "Адрес" есть ещё 30 полей... насколько я понял... но ведь поиск будет по индексу?? Т.е избыточность по айдишникам лучше чем по любым другим полям?? Основная проблема, на мой взгляд, в том что в приложении вы предлагаете человеку кроме клиента каждый раз вводить еще и реквизиты адреса. В итоге в вашей таблице адресов будет куча Борвих: Моск.обл *****Борвиха Моск обл *****Борвиха Московская обл.*****Борвиха Московская обл*****Борвиха "Каша" в справочнике - это по-моему основная проблема. Привести все потом к единому виду очень тяжело. Во-вторых тут нет никакой "избыточность по айдишникам". 1000 клиентов из Борвихи действительно имеют вид: 1*****1 . . . 1000*****1 но так и должно быть. ДедушкаИ основная проблем в том, что в табл. "Адрес" есть ещё 30 полей... насколько я понял... но ведь поиск будет по индексу?? Хорошо, поиск по индексу. Таблица, в которой запись дублируется несколько десятков раз и занимать на диске будет в несколько десятков раз больше места. 100 Кб и 1Мб сейчас конечно несильно отличаются, но 1 Гб и 10 Гб отличаются существенно. И в запросе select Клиент.Имя, Адрес.Город, Адрес.Адрес1 from Клиент left outer join Адрес on Клиент.Адрес_ид=Адрес.Адрес_ид where Адрес.Адрес1='Кремль' для тысячи "Кремлевских" клиентов будет в сотни раз больше чтений с жесткого диска (достаточно дорогая операция) если адрес дублируется тысячу раз, чем при обращении к таблице где только одна такая запись. Индекс тут помагает, но панацеей не является. Таблица связи в свою очередь гораздо меньше чем таблица адресов. При доступе по индексу для тысячи клиетов "Кремлевских" будет пара чтений с диска для индекса и одино чтение для таблицы "Адрес". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 16:30 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Дедушка Спасибо. Но при таком построении для занесения новой записи Автор-Книга нужно провести скан табл. Автор на предмет есть ли уже такой, затем скан табл. Книга собственно за тем же... и только потом произвести запись в табл. связку. При сущностях Клиент Адрес единственное "за" за введение табл. связки это то, что если город или улицу переименуют то изменять придётся только одну строку вместо скажем 100-ни... Именно так, в частности если у Клиента изменился адрес - ищем новый в Адрес, не нашли - добавляем новую запись в Адрес и обновляем АдресКлиента. Эту технологию легко можно проследить практически в любой системе от 1С и до R/3. Изменение связи адреса с клиентом в корне отличается от изменения характеристик собственно адреса, например, данный дом почтовая служба передала другому почтовому отделению или, как вы говорите переименовали улицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 22:19 |
|
||
|
Чем плоха связь "многие ко многим"...?
|
|||
|---|---|---|---|
|
#18+
Дедушка Покажите мне эти ваши книжки где сказано что многи ко многим надо избегать!? Единственное что там может быть сказано, так это что такая связь при близком рассмотрения сама по себе является сущностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2005, 22:59 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=147&tid=1545628]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
23ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 315ms |

| 0 / 0 |
