powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / отношения...
17 сообщений из 17, страница 1 из 1
отношения...
    #32861829
zdraste
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
интересует Ваше мнение:
1. Какой PK лучше использовать и в каких ситуациях в отношении many2many
(суррогат, составной по внешним ключам, ...)

спасибо.
...
Рейтинг: 0 / 0
отношения...
    #32861837
Фотография ChMt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
составной по fk

Я понимаю, что пишу правильно и призываю всех следовать моему примеру.
...
Рейтинг: 0 / 0
отношения...
    #32861856
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а я бы все равно сделал "еще один" первичный, а составной по fk - определил бы как альтернативный (уникальный)
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
отношения...
    #32861874
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
объясню...
если понадобиться сослаться на отношение many2many то понадобиться в ссылающейся таблице создать два поля для fk на many2many.
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
отношения...
    #32861969
zdraste
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Роман Дынник... если понадобиться сослаться на отношение many2many то понадобиться в ссылающейся таблице создать два поля для fk на many2many.

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

Хотя если отношение m2m в других отношениях не учавствует видимо оптимальный вариант - составной ПК.
...
Рейтинг: 0 / 0
отношения...
    #32862073
Alexey Rovdo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Роман Дынника я бы все равно сделал "еще один" первичный, а составной по fk - определил бы как альтернативный (уникальный)
Posted via ActualForum NNTP Server 1.1

Мне тоже кажется, что такой подход обеспечивает большую гибкость и от его использования имеет смысл отказываться только если количество записей предполагается очень большим.
...
Рейтинг: 0 / 0
отношения...
    #32862435
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я в many-to-many использую unique-индекс по 2 полям из внешних таблиц и дополнительный ID. Пример: есть справочник субъектов, есть справочник ролей, соответственно для каждой роли есть дополнительные атрибуты. Они как раз привязаны к таблице, описывающей отношение m:n м/у этими таблицами. Они связаны именно по ID. Нельзя искуственно себя ограничивать, утверждая, что такого не будет.
...
Рейтинг: 0 / 0
отношения...
    #32862442
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя если отношение m2m в других отношениях не учавствует видимо оптимальный вариант - составной ПК

Согласен
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
отношения...
    #32864113
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть на эту таблицу (таблицу связи, реализующую N:M) нет ссылок из других таблиц - однозначно составной по внешним ключам. Если есть - то тогда уже думат надо - смотреть на суммарную длину составного ключа в кол-ве полей и в байтах.
...
Рейтинг: 0 / 0
отношения...
    #32864134
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман Дынника я бы все равно сделал "еще один" первичный, а составной по fk - определил бы как альтернативный (уникальный)
Posted via ActualForum NNTP Server 1.1
... и получил бы артефакты при необходимости ссылок на эту связь. не всегда конечно.

Роман Дынник
Хотя если отношение m2m в других отношениях не учавствует видимо оптимальный вариант - составной ПК

Согласен
Posted via ActualForum NNTP Server 1.1

LOL
Как раз если в других отношениях не участвует - то хоть каким делай ПК.
...
Рейтинг: 0 / 0
отношения...
    #32864332
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и получил бы артефакты при необходимости ссылок на эту связь. не всегда конечно

какие артефакты?
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
отношения...
    #32864998
ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простенький пример. Составляем словарь базы данных - таблицы, поля, связи между таблицами. Храним это добро в следующей структуре:
Tables ( TableID , Name, Owner, other attributes)
TableFields ( TableID , FieldID , Name, Type, Size, other attributes)
Relations ( RelationID , TableID , ForeignTableID , Name, other attributes)
RelationFields ( RelationID , TableID , FieldID , ForeignTableID , ForeignFieldsID )

PK выделены болдом
TableFields.TableID, Relations.TableID, Relations.ForeignTableID - внешние ключи на Tables
RelationFields.(RelationID & TableID & ForeignTableID) - внешний ключ на Relations
RelationFields.(TableID & FieldID) и RelationFields.(ForeignTableID & ForeignFieldID) - внешние ключи на TableFields

Relations является реализацией связи многие-ко-многим с дополнительным ключевым аттрибутом (RelationID, необходим для возможности задания множественных реляций между одной парой таблиц). Для простоты можно принять, что между парой таблиц может быть только одна связь, выкинуть RelationID отовсюду, и получить классическую связь многие-ко-многим.
Ну да не суть. Пытаемся избавиться от составного PK в таблице Relations, чтобы не тянуть его дальше по всем связанным таблицам (в нашем случае это RelationFields).

Если в Relations составной PK заменить суррогатным несоставным, и соответствующим образом переделать RelationFields, то получим:
Tables ( TableID , Name, Owner, other attributes)
TableFields ( TableID , FieldID , Name, Type, Size, other attributes)
Relations ( RelationID_Ersatz , RelationID, TableID, ForeignTableID, Name, other attributes)
RelationFields ( RelationID_Ersatz , TableID , FieldID , ForeignTableID , ForeignFieldsID )

TableFields.TableID, Relations.TableID, Relations.ForeignTableID - внешние ключи на Tables
RelationFields.RelationID_Ersatz - внешний ключ на Relations
RelationFields.(TableID & FieldID) и RelationFields.(ForeignTableID & ForeignFieldID) - внешние ключи на TableFieldsПри этом имеем очевидную кривизну - в RelationFields могут быть ссылки на TableFields, относящиеся к каким угодно таблицам, в том числе и не входящим в реляцию.

Правда пример не очень красивый получился, т.к. от замены составного PK не несоставной в связанной таблице ключ не сократился, ну да ничего. Если избавится от составного ключа в таблице TableFields, то получим сокращение ключа в таблице RelationFields до (RelationID_Ersatz, FieldID_Ersatz, ForeignFieldID_Ersatz). Только вот данные все равно кривые будут.
Так что аккуратнее надо избавляться от составных ключей.
...
Рейтинг: 0 / 0
отношения...
    #32865204
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне что то влом пока доконца вникнуть в предыдущий пост,
но ввреху я говорил что составной ключ никуда не пропадает, он просто из первичного превращается в альтернативный(уникальный) так что никакой кривизны в данных не будет.
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
отношения...
    #32865259
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но ввреху я говорил что составной ключ никуда не пропадает, он просто из первичного превращается в альтернативный(уникальный) так что никакой кривизны в данных не будет.

ага, точно точно.
ссылаться на эту таблицу ты по какому ключу будешь? по новому несоставному - будут кривые данные. по старому составному (который из первичного стал альтернативным уникальным) - тогда нафига тебе вообще этот новый несоставной ключ, если ты его даже не используешь?
...
Рейтинг: 0 / 0
отношения...
    #32865342
zdraste
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Лох Позорный - OFF: замечательный ник :)
авторага, точно точно.
ссылаться на эту таблицу ты по какому ключу будешь? по новому несоставному - будут кривые данные. по старому составному (который из первичного стал альтернативным уникальным) - тогда нафига тебе вообще этот новый несоставной ключ, если ты его даже не используешь?
Дело говоришь.
Но не стоит ли здесь задуматься над использованием альтернативных способов обеспечения целосности (тех же триггеров напримет) дабы не тащить за собой эти составные ПК?
...
Рейтинг: 0 / 0
отношения...
    #32865379
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Лох Позорный
Бизнес-логику пытаемся навесить на структуру данных?
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
отношения...
    #32865439
ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 zdraste
Но не стоит ли здесь задуматься над использованием альтернативных способов обеспечения целосности (тех же триггеров напримет) дабы не тащить за собой эти составные ПК?
Задуматься - можно и нужно.
Описанный случай - это пример нарушения 4-й нормальной формы. В принципе можно всякими триггерами, хранимками, констрейнтами и прочей лабудой компенсировать отсутствие 4-й НФ. И даже 3-ей. И даже 1-ой, если очень хочется :).
Иногда так и приходится делать.
Только я вряд ли пойду на то, чтобы сознательно устраивать денормализацию только из-за того, что лениво составные ключи таскать за собой.

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


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