Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь многие ко многим / 25 сообщений из 64, страница 1 из 3
20.06.2007, 11:06
    #34606971
Buga-buga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Возник такой вопрос:
Есть связь многие ко многим, реализованная при помощи промежуточной таблицы. Первичный ключ в промежуточной таблице - это сочетание внешних ключей первых двух таблиц. Что изменится если удалить это ключ? Т.е. в промежуточной таблице столбцы останутся просто они не будут являться первичным ключом.
Заранее спасибо за ответы.
...
Рейтинг: 0 / 0
20.06.2007, 11:34
    #34607079
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Если вы не задали ограничения на связи между таблицами то у вас образуется плохая запись - указывающая не несуществующие записи таблиц.

Ставьте ограничения ссылочной целостности чтобы не допустить появления такой ситации, либо периодически вылавливайте и обрабатывайте такие плохие записи.
...
Рейтинг: 0 / 0
20.06.2007, 12:21
    #34607290
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Buga-bugaЧто изменится если удалить это ключ? Т.е. в промежуточной таблице столбцы останутся просто они не будут являться первичным ключом.Тогда будет возможность добавить в таблицу множественные связи (например выставить три раза один и тот же признак), и начнутся проблемы с удалением множественных атрибутов.

Опишите ЗАЧЕМ вы это хотите сделать - тогда можно будет сказать будет плохо или не очень.
...
Рейтинг: 0 / 0
20.06.2007, 13:54
    #34607710
Buga-buga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Программист-ЛюбительЕсли вы не задали ограничения на связи между таблицами то у вас образуется плохая запись - указывающая не несуществующие записи таблиц.
2 поля в связующей таблице - это Foreign Key - и здесь нам "ошибиться" не дадут - т.е. плохих записей не будет.
...
Рейтинг: 0 / 0
20.06.2007, 13:59
    #34607732
Buga-buga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
BelyОпишите ЗАЧЕМ вы это хотите сделать - тогда можно будет сказать будет плохо или не очень.

Я изучаю SQL, и не могу ответить на этот вопрос, а ответ хотелось бы знать.
...
Рейтинг: 0 / 0
20.06.2007, 14:02
    #34607742
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Я изучаю SQL, и не могу ответить на этот вопрос, а ответ хотелось бы знать.
тогда лучше всего начать с чтения что есть первичный ключ и зачем он нужен
...
Рейтинг: 0 / 0
21.06.2007, 11:53
    #34610163
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Buga-bugaЯ изучаю SQL, и не могу ответить на этот вопрос, а ответ хотелось бы знать.1. Что такое Многое ко Многим.
Такую связь используют, например, при указании различных характеристик объекта

Унас есть таблицы: Товар и Характеристики товаров.
Есть товар: Пылесос. У него бывают характеристики: цвет, мощность, Тип используемых пакетов
Есть товар: Упаковка скрепок. У него есть характеристики: Кол-во штук в упаковке, размер.
Есть товар: Электрочайник. У него есть характеристики: Цвет, мощность, объем.

Для хранения таких признаков и используются связи многое ко многим

Таблица "Товар"
ID NAME1 Пылесос2 Упаковка скрепок3 Электрочайник
Таблица "Характеристики"
ID PROP_NAME1 Цвет2 Мощность3 Тип пакетов для пылесоса4 Кол-во штукв упаковке5 Размер6 Объем
Теперь указываем у какого товара какие характеристики есть.
Таблица: "Характеристики_Товара"
PRODUCT_ID PROP_ID1112132425313236

2. Теперь если мы удалим ограничение уникальности с таблицы "Характеристики_Товара", то у нас появится возможность указать два раза одну характеристику.
Например: у пылесоса указать два раза цвет.
PRODUCT_ID PROP_ID11111213
3. Теперь о проблемах - нам надо удалить одно свойство ЦВЕТ у пылесоса, а второе оставить.
Мы этого сделать не сможем по нормальному
Код: plaintext
1.
DELETE FROM "Характеристики_Товара"
WHERE PRODUCT_ID =  1  and PROP_ID =  1 
Этот запрос удалит две строки, хотя нам надо было удалить одну.
...
Рейтинг: 0 / 0
26.06.2007, 01:39
    #34618878
Ursego
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
BelyТеперь о проблемах - нам надо удалить одно свойство ЦВЕТ у пылесоса, а второе оставить.Этой ситуации нельзя допустить, система должна позволять вводить только уникальные комбинаци. Что хорошего в том, что ту-же комбинацию можно вставить 20 раз? Нужно либо чтоб комбинация была первичным ключём таблицы-посредника, либо (если первичный ключ - нумератор, другое поле) иметь ограничение unique.
...
Рейтинг: 0 / 0
26.06.2007, 10:23
    #34619212
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Ursego BelyТеперь о проблемах - нам надо удалить одно свойство ЦВЕТ у пылесоса, а второе оставить.Этой ситуации нельзя допустить, система должна позволять вводить только уникальные комбинаци. Что хорошего в том, что ту-же комбинацию можно вставить 20 раз?Хосподи....
Смотрите на мир ШИРЕЕ. Где-то такое нельзя допустить, а где-то только так и нужно.

Например:
У нас есть системный блок, есть комплектующие.
Эти таблицы связаны друг с другом: Многие-ко-Многим
Сколько может быть установлено процессоров в компьютере?
Правильно - один или больше.
Про жесткие диски и память - тем более.
Уникальность здесь просто вредна.
...
Рейтинг: 0 / 0
26.06.2007, 11:11
    #34619391
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
BelyСколько может быть установлено процессоров в компьютере?
Правильно - один или больше.
Про жесткие диски и память - тем более.
Уникальность здесь просто вредна.
Вы меняете условия задачи. У Вас не простая связь многие-ко-многим, а атрибутированная, ПК соответственно - связь+связь+id_детали (ну или подобная).
...
Рейтинг: 0 / 0
26.06.2007, 11:21
    #34619431
guest_20040621
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
> Правильно - один или больше

Не приходит в голову, что, например, нельзя установить два разных процессора? Или можно установить процессор + заглушку?

> Про жесткие диски и память - тем более

Про валидированные компоненты слышали?
...
Рейтинг: 0 / 0
26.06.2007, 12:00
    #34619600
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Buga-buga пишет:
> ключей первых двух таблиц. Что изменится если удалить это ключ? Т.е. в
> промежуточной таблице столбцы останутся просто они не будут являться
> первичным ключом.

Исчезнет требование уникальности значений в этих полях.
И исчезнет индекс как средство обеспечения хорошей производительности.
(но он возможно и не нужен).

Если сделать аналогичный ключу уникальный индекс, то вообще ничего
не изменится.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
26.06.2007, 12:39
    #34619769
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
softwarer BelyСколько может быть установлено процессоров в компьютере?
Правильно - один или больше.
Про жесткие диски и память - тем более.
Уникальность здесь просто вредна.
Вы меняете условия задачи. У Вас не простая связь многие-ко-многим, а атрибутированная, ПК соответственно - связь+связь+id_детали (ну или подобная).Конечно меняю, потому что я рассказыва НЕ про задачу, а про использование связи МНОГО ко МНОГИМ.
У меня есть типовая конфигурация заказного компьютера.
В него можно поставить (на выбор) 1,2 процессора, до 3-х HDD, 0-1 видеокарту, 0-2 звуковые карты.
Это - определение конфигурации в рамках которой менеджер может вставить конкретные детали в заказ на сборку.
Конкретной детали здесь нет. Есть тип детали (диск или CPU или видеокарта или что там еще).
Вот такую конфигурацию я и собираюсь хранить в связи Много-ко-Многим.

Изначально задача вообще была поставлена так:
авторВозник такой вопрос:
Есть связь многие ко многим, реализованная при помощи промежуточной таблицы.Про предметную область - ни слова.

Да, в большинстве случаев много-ко-многим - уникальность будет нужна.
Но НЕ ВСЕГДА . В каждом случае - решается отдельно.
Я про это.
...
Рейтинг: 0 / 0
26.06.2007, 12:43
    #34619791
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
guest_20040621> Правильно - один или больше
Не приходит в голову, что, например, нельзя установить два разных процессора? Или можно установить процессор + заглушку?Это правила другого уровня.

guest_20040621> Про жесткие диски и память - тем более
Про валидированные компоненты слышали?Не знаю что именно вы имеете ввиду.
Скорее всего догадываюсь, но наверняка не скажу.

И какое это имеет отношение к данной теме?
...
Рейтинг: 0 / 0
26.06.2007, 12:47
    #34619811
guest_20040621
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
> Это правила другого уровня.

Какого "другого уровня"?

> И какое это имеет отношение к данной теме?

Если приводите примеры, попробуйте делать это без ошибок.
...
Рейтинг: 0 / 0
26.06.2007, 12:48
    #34619815
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
guest_20040621> И какое это имеет отношение к данной теме?
Если приводите примеры, попробуйте делать это без ошибок.Ну так распишите в чем ошибка
...
Рейтинг: 0 / 0
26.06.2007, 19:06
    #34621300
Ursego
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
Bely Ursego BelyТеперь о проблемах - нам надо удалить одно свойство ЦВЕТ у пылесоса, а второе оставить.Этой ситуации нельзя допустить, система должна позволять вводить только уникальные комбинаци. Что хорошего в том, что ту-же комбинацию можно вставить 20 раз?Хосподи....
Смотрите на мир ШИРЕЕ. Где-то такое нельзя допустить, а где-то только так и нужно.

Например:
У нас есть системный блок, есть комплектующие.
Эти таблицы связаны друг с другом: Многие-ко-Многим
Сколько может быть установлено процессоров в компьютере?
Правильно - один или больше.
Про жесткие диски и память - тем более.
Уникальность здесь просто вредна.Естественно, что одна и та же деталь может быть установлена более, чем один раз (болты - даже более наглядный пример, чем процессоры). Для этого в таблицу-посредник просто добавляется поле "количество". По Вашей версии выходит, что если в компе 20 одинаковых болтов, то добавляется 20 записей - это даже смешней, чем "if true then". Итак, попрошу другой пример когда "только так и нужно".
...
Рейтинг: 0 / 0
26.06.2007, 19:54
    #34621393
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
UrsegoЕстественно, что одна и та же деталь может быть установлена более, чем один раз (болты - даже более наглядный пример, чем процессоры). Для этого в таблицу-посредник просто добавляется поле "количество". По Вашей версии выходит, что если в компе 20 одинаковых болтов, то добавляется 20 записей - это даже смешней, чем "if true then". Итак, попрошу другой пример когда "только так и нужно".1. Хранить кол-во элементов или хранить все варианты множественного выбора - варианты примерно равноценные.
Иногда удобнее так, иногда по другому.
Из одного представления можно получить другое и наоборот, хотя иногда с извращениями.

2. Вы к связи Многое-ко-Многим добавили поле и ушли от классического понимания этой связи.
softwarerУ Вас не простая связь многие-ко-многим, а атрибутированная,
3. Вы добавили новое поле, тогда добавлю и я поле - называться будет RANK.
Будет определять порядок элементов в списке.
Мы будем делать шаблон вывода на печать на кассовую ленту.
Есть таблица элементов, есть таблица шаблонов.
шаблон может выглядеть так:
Пропуск
Пропуск
Печать ИНН
Пропуск
Список Товаров
Прочерк
Сумма товара
Получено Денег
Пропуск
Фискальные данные

Здесь вы уже не сможете обойтись уникальностью пар и количеством.


Но все это постепенно уже удаляется от изначального вопроса...
...
Рейтинг: 0 / 0
27.06.2007, 21:46
    #34624770
Ursego
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
BelyВы к связи Многое-ко-Многим добавили поле и ушли от классического понимания этой связи.Я не к связи добавил (она как была так и осталась посредством тех-же полей), а к таблице. Вполне естественно, что таблица, сущность которой - связь других таблиц many-to-many, может содержать и другие поля (причём нередко их больше, и намного, чем полей, непосредственно причастных к связи). Вот таблица, описывающая строку invoice-а (извиняюсь, не знаю как по-русски), это таблица связи между таблицей инвойсов (точнее, их заголовков, где дата, поинтер на покупателя и прочие поля) и таблицей продуктов. Так что, по-Вашему выходит, что если эта таблица содержит дополнительные поля кроме invoice_num и product_num (например, "цена единицы продукта в момент сделки" и "количество"), то это "уход от классического понимания этой связи"? Что-же это тогда, если не many-to-many?

Кстати, пример того, когда в связывающей таблице НЕОБХОДИМО разрешить дублирование комбинаций внешних ключей, так и не был преведен.
...
Рейтинг: 0 / 0
27.06.2007, 22:35
    #34624836
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
UrsegoКстати, пример того, когда в связывающей таблице НЕОБХОДИМО разрешить дублирование комбинаций внешних ключей, так и не был преведен.
Ну это тривиально. Допустим, слева - клиенты, справа - банки, развязка - банковские счета.
...
Рейтинг: 0 / 0
28.06.2007, 10:35
    #34625391
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
UrsegoТак что, по-Вашему выходит, что если эта таблица содержит дополнительные поля кроме invoice_num и product_num (например, "цена единицы продукта в момент сделки" и "количество"), то это "уход от классического понимания этой связи"? Что-же это тогда, если не many-to-many?Если добавлять атрибуты к связи, то это получится уже не связь, а новая сущность.

Иначе к связи многое ко многому можно причислить что угодно ссылающееся на две таблицы.
Например, есть таблица ORG у которой два поля являются FK на таблицы ORG_TYPE и ORG_ADDRES.
По вашему это связь много ко многим, чтоли?
...
Рейтинг: 0 / 0
28.06.2007, 12:03
    #34625708
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
BelyЕсли добавлять атрибуты к связи, то это получится уже не связь, а новая сущность.
Между этими понятиями нет принципиальной разницы. Вопрос терминологии, конечно, но исторически, еще до RDBMS, сложились понятия "запись" и "связь, в том числе атрибутированная связь". Скажем, если рассматривать мою связь с ВУЗом, в ней будут атрибуты дата поступления, дата окончания, номер диплома итп. Если связи нет - если у меня нет высшего образования - нет и этих атрибутов.

При введении RDBMS понятие связи как физического объекта убили, точнее, втянули в понятие записи. Например, вышеописанная ситуация решается включением атрибутов в мою запись плюс check constraint-ами, которые не позволят заполнить атрибуты без указания id ВУЗа. Поскольку логически такое понятие осталось - периодически и проявляются коллизии.

BelyИначе к связи многое ко многому можно причислить что угодно ссылающееся на две таблицы. Например, есть таблица ORG у которой два поля являются FK на таблицы ORG_TYPE и ORG_ADDRES. По вашему это связь много ко многим, чтоли?
Нет. Но стоит понимать, что это определяется неформально, исключительно той ролью, которую разработчик отводит таблице в своих рассуждениях, никак не фиксируя ее в схеме данных.

Чтобы показать это - пример, обратный Вашему. Возьмите любую пару таблиц, как Вы считаете, связанных многие-ко-многим, и добавьте в таблицу связи поля date_from, date_to. По-вашему, таблица теперь перестала быть связью многие-ко-многим?
...
Рейтинг: 0 / 0
28.06.2007, 16:44
    #34626724
Bely
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
softwarerЧтобы показать это - пример, обратный Вашему. Возьмите любую пару таблиц, как Вы считаете, связанных многие-ко-многим, и добавьте в таблицу связи поля date_from, date_to. По-вашему, таблица теперь перестала быть связью многие-ко-многим?Здесь, пожалуй, соглашусь.
Эта связь всеравно останется Много-ко-Многим.
...
Рейтинг: 0 / 0
28.06.2007, 19:54
    #34627263
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
В реляционной БД нет связей, есть таблицы и ограничения ссылочной целостности. В процессе реижиниринга схемы БД в ER модель в зависимости от наших целей, мы можем обозвать одни таблицы связями, другие сущностями.

Например, связь двух сущностей может быть реализована целой цепочкой таблиц, но если эти промежуточные таблицы в данный момент нас не интересуют, в ER модели мы можем изобразить только связь этих сущностей, опустив детали реализации.

Фактически связи отношений (таблиц и представлений) реляционной БД возникают только в процессе выполнения SQL запроса. Как напишем условия соединения таблиц в запросе, такая связь и получиться. Она может быть отражена в ER модели, но может и отсутствовать. Более того, она может быть совершенно бессмысленной, с точки зрения бизнес логики, как например соединение поставщика и товара по № телефона и артикулу изделия. Иногда связь может иметь атрибуты, которых нет в БД, например, нужно получить исторические сведения о сотруднике и его зарплате на определённую дату в прошлом. Без этой даты связь будет 1:*, с датой, 1:1.

Очень хорошо связи (ассоциации) развиты в UML.

Что касается множественности связи, то иметь таблицу без PK не хорошо. Но и вводить суррогатный ключь, или счётчик кратности связи тоже не всегда удобно. Если использовать счётчик кратных связей, то он может стать узким местом, когда одновременно многие процессы создают связи некоторых объектов. Без счётчика может возникнуть ситуация, когда два пользователя пытаются уменьшить число связей на 1, например из 10 связей получить 9, но каждый удаляет по одной связи и в итоге получается не 9 а 8 связей. Здесь, для принятия решения нужно проанализировать предметную область.
...
Рейтинг: 0 / 0
28.06.2007, 21:26
    #34627350
BW
BW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь многие ко многим
mcureenabВ реляционной БД нет связей, есть таблицы и ограничения ссылочной целостности. В процессе реижиниринга схемы БД в ER модель в зависимости от наших целей, мы можем обозвать одни таблицы связями, другие сущностями.

Например, связь двух сущностей может быть реализована целой цепочкой таблиц, но если эти промежуточные таблицы в данный момент нас не интересуют, в ER модели мы можем изобразить только связь этих сущностей, опустив детали реализации.

Фактически связи отношений (таблиц и представлений) реляционной БД возникают только в процессе выполнения SQL запроса. Как напишем условия соединения таблиц в запросе, такая связь и получиться. Она может быть отражена в ER модели, но может и отсутствовать. Более того, она может быть совершенно бессмысленной, с точки зрения бизнес логики, как например соединение поставщика и товара по № телефона и артикулу изделия. Иногда связь может иметь атрибуты, которых нет в БД, например, нужно получить исторические сведения о сотруднике и его зарплате на определённую дату в прошлом. Без этой даты связь будет 1:*, с датой, 1:1.


Во-первых, обязательно нужно делать ссыдку, что речь идет о реляционной модели.
Во-вторых, не нужно путать физическую и логическую модель данных. Физическая модель может отличаться от одной СУБД к другой на одной логической моделе БД.

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


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