powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Чем плоха связь "многие ко многим"...?
25 сообщений из 66, страница 1 из 3
Чем плоха связь "многие ко многим"...?
    #33263856
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
В умных книгах советуют... если обнаруживается связь "многие ко многим" между таблицами вводить дополнительную табл. связки и связывать через неё по "один ко многим". Подскажите что при этом мы выигрываем...?
Спасибо.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33263878
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сугубо мое мнение.
Что значит если нашли? вопрос исходит от задачи, если нужно сделать такую таблицу - то брать ее и делать. Конечно можно разделить ее на 2 или 3 штуки. Но тут стоит узнать как работает сервер с таблицами. Некоторые сервера быстрее отбрабатывают 1 таблицу по индексам, нежели связку нескольких по индексам.
Поэтому такое утверждение как аксиома не корректно. Нужно смотреть конкретный случай.
На практике таблицы многие-ко-многим делаю, если это наиболее оптимальное решение в проектировании и до сих пор в этом не разочаровался.

Что вы от этого выиграете?
Можно выиграть немного в быстродействии, а можно и проиграть.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33263922
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер MSSQL2K.
Есть табл. "Клиенты" и "Адреса". У одного клиента может быть много адресов и на одном адресе может быть зарегистрированно много клиентов... Вопрос: как лучше... оставить две эти табл. и связать по "Клиент.id" и тогда в табл. "Адреса" будут множественные записи по клиенту либо создать табл. связки где будут только id-шники клиентов и адресов правда тоже множественные записи и не очень понятно в чём выигрыш...??
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33263983
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка Подскажите что при этом мы выигрываем...?
В основном то, что связь "многие ко многим" обычно не поддерживается напрямую механикой сервера БД и приходится использовать тот или иной трюк.Таблица развязки - наиболее популярный из таких трюков и пожалуй наиболее корректный с точки зрения "духа реляционной теории".

ДедушкаЕсть табл. "Клиенты" и "Адреса". У одного клиента может быть много адресов и на одном адресе может быть зарегистрированно много клиентов... Вопрос: как лучше... оставить две эти табл. и связать по "Клиент.id" и тогда в табл. "Адреса" будут множественные записи по клиенту
Если Вы свяжете их по "Клиент.id", в таблице "Адреса" не будет "много клиентов на одном адресе" - если меня не глючит и MSSQL еще не научился делать массивов в полях. Будут "много клиентов на совпадающих адресах".

Дедушкалибо создать табл. связки где будут только id-шники клиентов и адресов правда тоже множественные записи и не очень понятно в чём выигрыш...??
Относительно скорости, как справедливо заметил Валентин, вопрос неоднозначный. Выигрыш, я бы сказал, в простоте и универсальности такой структуры - она легко воспринимается, к ней легко писать любые запросы, чаще всего она достаточно эффективна.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264003
zayac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка... в табл. "Адреса" будут множественные записи по клиенту...
Как вы это собираетесь сделать ? В табл. "Адреса" завести текстовое поле "Список Клиентов" и записывать в него 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 - всех этих проблем просто не будет.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264025
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Афтор темы - ответьте пож-ста на следующий вопрос.
Какие отрицательнае факторы вы видите в создании таблицы многие-ко-многим, поддержании целостности данных и работе с этой таблицей?
Какие вы ожидаете положительные качества от разделения этой таблицы?

Это вопросы на уровне концепции реализации этого кусочка предметной области.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264055
Templar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка Добрый день.
В умных книгах советуют... если обнаруживается связь "многие ко многим" между таблицами вводить дополнительную табл. связки и связывать через неё по "один ко многим". Подскажите что при этом мы выигрываем...?
Спасибо.

Попробуйте сначала найти как минимум еще одно решение, а потом уже определять, что выигрываем/проигрывеам.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264173
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если использовать пример с табл-ми "Клиенты" и "Адреса" то конечно связь многие к многим реализуется как множественные записи т.е для разных Клиент.id повторяется один Адрес...
Тогда желая получить все адреса клиента мы делаем выборку из "Адреса" по конкретному Клиент.id и получаем список адресов клиента, обратно работает для получения всех клиентов с этим адресом...
Во многих толстых книгах по построению БД советуют такие сущности разделять через табл. связки, но ни где толком не объясняется почему?? Вчём проблема при такой организации БД (с нормализацией что ли...)??
Этот вопрос для меня тёмный поэтому и спрашиваю...
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264242
zayac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напишите пример.
Код: plaintext
1.
2.
3.
4.
5.
6.
create table ADDRESS...
create table CLIENT...

insert into ADDRESS...
...
insert into CLIENT...
...
так чтобы был клиент с одним адресом и клиент с тремя адресами
и так чтобы был адрес для по которому находиться один клиент и адрес по которому находиться три клиента.
И select-ы которыми вы получаете
Дедушка...желая получить все адреса клиента мы делаем выборку из "Адреса" по конкретному Клиент.id и получаем список адресов клиента, обратно работает для получения всех клиентов с этим адресом...
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264318
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну условно...
Клиенты:

Клиент_ид
Имя

Адрес:
Адрес_ид
Клиент_ид
Город
Адрес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='Кремль'
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264330
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zayacНапишите пример.
Код: plaintext
1.
2.
3.
4.
5.
6.
create table ADDRESS...
create table CLIENT...

insert into ADDRESS...
...
insert into CLIENT...
...
так чтобы был клиент с одним адресом и клиент с тремя адресами
и так чтобы был адрес для по которому находиться один клиент и адрес по которому находиться три клиента.
И select-ы которыми вы получаете
[/quot]
Главное - Адрес, по которому пока нет ни одного Клиента и Клиента, чей Адрес не известен. Независимое существование адресов и клиентов и обеспечивается сущностью АдресКлиента.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264338
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В предыдущем очепятка... :) Связка по Клиент_ид.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264361
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка Ну условно...

Адрес:

Адрес_ид
Клиент_ид
Город
Адрес1

Адрес:
1*****1*****Москва*****Кремль
2*****1*****Моск.обл.*****Борвиха
3*****2*****Москва*****Кремль
4*****2*****Моск.обл.*****Борвиха

Вот в этом и вопрос - является ли Адрес у нас самостоятельной сущностью?
В вашем примере нет - таблицу правильнее назвать АдресКлиента. А собственно Адрес без привязки к Клиенту отсутствует.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264369
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelR
Главное - Адрес, по которому пока нет ни одного Клиента и Клиента, чей Адрес не известен. Независимое существование адресов и клиентов и обеспечивается сущностью АдресКлиента.
В данной системе не предполагается Клиента без адреса и Адреса без клиента... Т.е разделение связи многие ко многим через табл. связи актуально если необходимо независимость сущностей Клиент и Адрес??
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264386
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне казалось, что грабли в чём то другом...
Ну вот пример из pubs-а где табл. "Авторы" и "Названия книг". Везде говорится, что это многие ко многим и поэтому
будем разделять через связку. Хотя очевидно, что не будет авторов без книг и книг без авторов...
Вот и вопрос ПОЧЕМУ ПОЭТОМУ ...??
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264408
zayac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас неправильное представление о практической реализации связи "многие ко многим". Тут явно видна избыточность.

Адрес:
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
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264446
zayac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДедушкаВ данной системе не предполагается Клиента без адреса и Адреса без клиента... Т.е разделение связи многие ко многим через табл. связи актуально если необходимо независимость сущностей Клиент и Адрес??
ModelR сделал абсолютно верное замечание. Если удалить всех ваших клиентов из Борвихи - то и Борвиха прекратит свое существование. Если вы именно этого и добиваетесь - объединяйте таблицы "Адрес" и "Клиент". (Опять же - будет некоторая избыточность).
ДедушкаНу вот пример из pubs-а где табл. "Авторы" и "Названия книг". Везде говорится, что это многие ко многим и поэтому будем разделять через связку. Хотя очевидно, что не будет авторов без книг и книг без авторов...
Мне это не очевидно. Если у нас книжный склад - то имеем таблицу "Книга" в которой есть поля "Название книги" и "Автор". Потому что различных книг у которых один и тоже автор на книжном складе несколько штук. Но если мы говорим о библиотеке, в которой выделяются полки на конкретных авторов (классиков) - то уже имеет смысл говорить о разделении "Книга"/"Автор".
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264454
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка Мне казалось, что грабли в чём то другом...
Ну вот пример из pubs-а где табл. "Авторы" и "Названия книг". Везде говорится, что это многие ко многим и поэтому
будем разделять через связку. Хотя очевидно, что и книг без авторов...
Вот и вопрос ПОЧЕМУ ПОЭТОМУ ...??
"Никогда не говори никогда". Поверив, что не будет авторов без книг, сделаем информацию об авторе полями в Книге.
Если мы удалим информацию про книгу, автор которой является автором единственно этой книги, то потеряем информацию про автора, а также про его адреса и т.д. А он возьмет и напишет еще, и придется снова его забивать.
И еще, задачи меняются. Однажды обнаружится, что кроме авторства, человек нам интересен по другим основаниям (сотрудник, подрядчик, критик). Поэтому изначально разумно выделить человека как сущность:

Человек ( ЧелИД, ФИО, ...),
Книга (КнИД, Наименование,...)
Авторство (ЧелИД,КнИД)
Рецензирование (ЧелИД,КнИД)

Именно об этих моментах обычно пишут в книгах....
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264467
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to: zayac
Ну хорошо... но ведь в табл. "Связь_Адрес_Клиент" тоже множественные записи
пусть 1000 клиентов из Борвихи тогда:
1*****1
.
.
.
1000*****1
И основная проблем в том, что в табл. "Адрес" есть ещё 30 полей... насколько я понял... но ведь поиск будет по индексу??
Т.е избыточность по айдишникам лучше чем по любым другим полям??
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264505
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДедушкаТ.е избыточность по айдишникам лучше чем по любым другим полям??
Безусловно. Но помимо всего прочего, это не будет избыточностью; это будет как раз минимально необходимой записью соответствующего факта.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264524
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelR Дедушка Мне казалось, что грабли в чём то другом...
Ну вот пример из pubs-а где табл. "Авторы" и "Названия книг". Везде говорится, что это многие ко многим и поэтому
будем разделять через связку. Хотя очевидно, что и книг без авторов...
Вот и вопрос ПОЧЕМУ ПОЭТОМУ ...??
"Никогда не говори никогда". Поверив, что не будет авторов без книг, сделаем информацию об авторе полями в Книге.
Если мы удалим информацию про книгу, автор которой является автором единственно этой книги, то потеряем информацию про автора, а также про его адреса и т.д. А он возьмет и напишет еще, и придется снова его забивать.
И еще, задачи меняются. Однажды обнаружится, что кроме авторства, человек нам интересен по другим основаниям (сотрудник, подрядчик, критик). Поэтому изначально разумно выделить человека как сущность:

Человек ( ЧелИД, ФИО, ...),
Книга (КнИД, Наименование,...)
Авторство (ЧелИД,КнИД)
Рецензирование (ЧелИД,КнИД)

Именно об этих моментах обычно пишут в книгах....

Спасибо.
Но при таком построении для занесения новой записи Автор-Книга нужно провести скан табл. Автор на предмет есть ли уже такой, затем скан табл. Книга собственно за тем же... и только потом произвести запись в табл. связку. При сущностях Клиент Адрес единственное "за" за введение табл. связки это то, что если город или улицу переименуют то изменять придётся только одну строку вместо скажем 100-ни...
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264582
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка
Но при таком построении для занесения новой записи Автор-Книга нужно провести скан табл. Автор на предмет есть ли уже такой, затем скан табл. Книга собственно за тем же... и только потом произвести запись в табл. связку.
Допустим (хотя в данном случае это вряд ли окажется именно так). Только не скан таблицы, а скан индекса. Простенькая ХП из двух операторов MERGE и вставки в связку.

Дедушка
При сущностях Клиент Адрес единственное "за" за введение табл. связки это то, что если город или улицу переименуют то изменять придётся только одну строку вместо скажем 100-ни...
Не единственное "за", но "решающее". Скажем, представьте себе запрос, который будет в Вашей схеме искать "подставные адреса", на которые зарегистрирована куча разных фирм. Вот это уж действительно будет перелопачивание абсолютно всей таблицы.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33264586
zayac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка
Ну хорошо... но ведь в табл. "Связь_Адрес_Клиент" тоже множественные записи
пусть 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='Кремль'
для тысячи "Кремлевских" клиентов будет в сотни раз больше чтений с жесткого диска (достаточно дорогая операция) если адрес дублируется тысячу раз, чем при обращении к таблице где только одна такая запись. Индекс тут помагает, но панацеей не является.
Таблица связи в свою очередь гораздо меньше чем таблица адресов. При доступе по индексу для тысячи клиетов "Кремлевских" будет пара чтений с диска для индекса и одино чтение для таблицы "Адрес".
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33265151
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка Спасибо.
Но при таком построении для занесения новой записи Автор-Книга нужно провести скан табл. Автор на предмет есть ли уже такой, затем скан табл. Книга собственно за тем же... и только потом произвести запись в табл. связку. При сущностях Клиент Адрес единственное "за" за введение табл. связки это то, что если город или улицу переименуют то изменять придётся только одну строку вместо скажем 100-ни...
Именно так, в частности если у Клиента изменился адрес - ищем новый в Адрес, не нашли - добавляем новую запись в Адрес и обновляем АдресКлиента. Эту технологию легко можно проследить практически в любой системе от 1С и до R/3.
Изменение связи адреса с клиентом в корне отличается от изменения характеристик собственно адреса, например, данный дом почтовая служба передала другому почтовому отделению или, как вы говорите переименовали улицу.
...
Рейтинг: 0 / 0
Чем плоха связь "многие ко многим"...?
    #33265181
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка

Покажите мне эти ваши книжки где сказано что многи ко многим надо избегать!? Единственное что там может быть сказано, так это что такая связь при близком рассмотрения сама по себе является сущностью.
...
Рейтинг: 0 / 0
25 сообщений из 66, страница 1 из 3
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Чем плоха связь "многие ко многим"...?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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