powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Составной PK
18 сообщений из 18, страница 1 из 1
Составной PK
    #32854097
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица материалов.
Однозначно материал определяется по его марке (шифр материала) и единице измерения(один и тот же материал может поставлятся в погонных метрах и тоннах). Это просто как пример.
Можно:
1. Сделать составной PK и далее ссылаться на него во всех таблицах
2. Сделать суррогатный ключ
Я склоняюсь однозначно ко второму варианту, вопрос в том, может ли кто привести пример, когда РЕАЛЬНО был необходим составной PK
...
Рейтинг: 0 / 0
Составной PK
    #32854122
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minvaвопрос в том, может ли кто привести пример, когда РЕАЛЬНО был необходим составной PK
Часто использую при связи m:n при необходимости уникальности комбинаций.
...
Рейтинг: 0 / 0
Составной PK
    #32854137
Semaphore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
minvaЕсть таблица материалов.
Однозначно материал определяется по его марке (шифр материала) и единице измерения(один и тот же материал может поставлятся в погонных метрах и тоннах). Это просто как пример.
Можно:
1. Сделать составной PK и далее ссылаться на него во всех таблицах
2. Сделать суррогатный ключ
Я склоняюсь однозначно ко второму варианту, вопрос в том, может ли кто привести пример, когда РЕАЛЬНО был необходим составной PKДело в том, что первичный ключ - это не прихоть разработчика. Структура ключа определяется на основе исследования функциональных зависимостей атрибутов отношения. Да, действительно, можно ввести суррогатный ключ, но это не решает проблем. Вам придется оставить естественный ключ, как уникальный. То есть, вместо одного ключа будет два. "Оно Вам надо?"
Что касается Вашего примера, то один и тот же материал может иметь много единиц измерения, и одна и та же ед. измерения может использоваться разными материалами. Получается, что связь между материалами и ед. измерения будет "многие-ко-многим".
...
Рейтинг: 0 / 0
Составной PK
    #32854139
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моём примере меня эта связь не интересует. Допустим есть чертёж, которому назначен материал - и ссылка на него шифр +единица измерения. И на эту связку может ссылаться не одна таблица. Это меня и смущает, зачем каждый раз таскать два атрита, вместо одного суррогатного
...
Рейтинг: 0 / 0
Составной PK
    #32854233
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть составоной ключ для связки шапкт документа с телом.
Физический смысл в таком ключе есть но связывать по нему уже задолбался.
IMHO лучше добавить лишний суррогат но зато потом не ссылаться через два или более полей на запись.
...
Рейтинг: 0 / 0
Составной PK
    #32854257
Semaphore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
minvaВ моём примере меня эта связь не интересует. Допустим есть чертёж, которому назначен материал - и ссылка на него шифр +единица измерения. И на эту связку может ссылаться не одна таблица. Это меня и смущает, зачем каждый раз таскать два атрита, вместо одного суррогатногоХорошо. Давайте рассмотрим такой пример. Допустим, что у нас есть следующие таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
TABLE OPERATIONS ( /* ОПЕРАЦИИ */
OP_NO PRIMARY KEY,
OP_NAME,
...);

TABLE MATERIALS ( /* МАТЕРИАЛЫ */
MAT_NO PRIMARY KEY,
MAT_NAME,
...);

TABLE CONSUMPTIONS ( /* ПОТРЕБЛЕНИЯ */
OP_NO REFERENCES OPERATIONS,
MAT_NO REFERENCES MATERIALS,
... ,
PRIMARY KEY (OP_NO, MAT_NO));

TABLE PRODUCTIONS ( /* ПРОИЗВОДСТВО */
OP_NO REFERENCES OPERATIONS,
MAT_NO REFERENCES MATERIALS,
... ,
PRIMARY KEY (OP_NO, MAT_NO));

TABLE PASSINGS ( /* ПЕРЕДАЧИ */
OP_SRC, /* ОПЕРАЦИЯ ПРОИЗВОДИТЕЛЬ */
OP_DST, /* ОПЕРАЦИЯ ПОТРЕБИТЕЛЬ */
MAT_NO, /* ПЕРЕДАВАЕМЫЙ МАТЕРИАЛ */
... ,
PRIMARY KEY (OP_SRC, OP_DST, MAT_NO),
FOREIGN KEY (OP_SRC, MAT_NO) REFERENCES PRODUCTIONS,
FOREIGN KEY (OP_DST, MAT_NO) REFERENCES CONSUMPTIONS);
Операция потребляет одни материалы и производит другие, которые передаются на другую операцию. Или, другими словами, материал, произведенный на одной операции, передается на другую операцию.
Теперь "заменим" от составные ключи на ключ, состоящий из одного (дополнительного) поля.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
TABLE OPERATIONS ( /* ОПЕРАЦИИ */
OP_NO PRIMARY KEY,
OP_NAME,
...);

TABLE MATERIALS ( /* МАТЕРИАЛЫ */
MAT_NO PRIMARY KEY,
MAT_NAME,
...);

TABLE CONSUMPTIONS ( /* ПОТРЕБЛЕНИЯ */
ID PRIMARY KEY,
OP_NO REFERENCES OPERATIONS,
MAT_NO REFERENCES MATERIALS,
...);

TABLE PRODUCTIONS ( /* ПРОИЗВОДСТВО */
ID PRIMARY KEY,
OP_NO REFERENCES OPERATIONS,
MAT_NO REFERENCES MATERIALS,
...);

TABLE PASSINGS ( /* ПЕРЕДАЧИ */
ID_SRC REFERENCES PRODUCTIONS,
ID_DST REFERENCES CONSUMPTIONS,
...);
На первый взгляд обе схемы равноценны. Но обратите внимание, что в первой схеме в передаче может участвовать только один материал, а во второй схеме может возникнуть коллизия, поскольку можно связать операцию производящую один материал с операцией, которая потребляет совсем другой материал. То есть, запись в таблице передач может быть абсурдна. В первом случае такая возможность исключена, поскольку поле материалов одно и то же для обоих внешних ключей.
Это не единственная проблема, решаемая с помощью составных ключей. Повторю еще раз, что выбор ключа - не прихоть разработчика, а результат анализа функциональных зависимостей.
...
Рейтинг: 0 / 0
Составной PK
    #32854277
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых я проверку на соответсвии могу в триггере сделать.
Во-вторых, если потребление однозначно соответсвует какому либо производству, то в потреблении я могу вообще материал не указывать (из указанной постановки на ясно как взаимодействуют потребление и производство).
Хотя в целом согласен с примером :-))) Спасибо
...
Рейтинг: 0 / 0
Составной PK
    #32854291
Semaphore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
minvaВо-первых я проверку на соответсвии могу в триггере сделать.Этим Вы еще больше усложните БД, поскольку подобных ситуаций в любой приличной БД может быть много. Не забывайте, что введение дополнительного ключа - это и введение дополнительного индекса.
minvaВо-вторых, если потребление однозначно соответсвует какому либо производству, то в потреблении я могу вообще материал не указывать (из указанной постановки на ясно как взаимодействуют потребление и производство).Нет, так делать нельзя. Поскольку планирование происходит по потребностям (от готовой продукции к сырью и комплектующим).
...
Рейтинг: 0 / 0
Составной PK
    #32854382
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Однозначно материал определяется по его марке (шифр материала) и единице
> измерения(один и тот же материал может поставлятся в погонных метрах и
> тоннах). Это просто как пример.

Imho странная идентификация материала. Вы не могли бы проиллюстрировать это примером?
...
Рейтинг: 0 / 0
Составной PK
    #32854432
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621> Однозначно материал определяется по его марке (шифр материала) и единице
> измерения(один и тот же материал может поставлятся в погонных метрах и
> тоннах). Это просто как пример.

Imho странная идентификация материала. Вы не могли бы проиллюстрировать это примером?Насколько я понимаю, речь идет о машиностроительных чертежах, точнее о графе "Материал" в основной надписи чертежа детали.
МатериалСталь ЭП-836 Пруток 42В чертеже при этом присутствует надпись:
Пример1. Допускается Сталь ЭП-836 Труба 42х20
...
Рейтинг: 0 / 0
Составной PK
    #32854454
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Насколько я понимаю, речь идет о машиностроительных чертежах, точнее о графе
> "Материал" в основной надписи чертежа детали.

Я тоже так подумал. Тогда при чем здесь единицы измерения в качестве идентификаторов?
...
Рейтинг: 0 / 0
Составной PK
    #32854510
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это наши постановщики так написали... Я пока тоже не врубался до конца в суть постановки, меня единицы измерения тоже смущают в качестве ключа
...
Рейтинг: 0 / 0
Составной PK
    #32854577
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Это наши постановщики так написали... Я пока тоже не врубался до конца в суть
> постановки, меня единицы измерения тоже смущают в качестве ключа

Imho составные ключи полезны, если сущность требуется сделать уникальной за пределами области ее [основного] определения. А описываемая Вами задача вполне может быть решена без составных ключей. Трясите постановщиков.
...
Рейтинг: 0 / 0
Составной PK
    #32854983
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semaphore На первый взгляд обе схемы равноценны. Но обратите внимание, что в первой схеме в передаче может участвовать только один материал, а во второй схеме может возникнуть коллизия, поскольку можно связать операцию производящую один материал с операцией, которая потребляет совсем другой материал. То есть, запись в таблице передач может быть абсурдна. В первом случае такая возможность исключена, поскольку поле материалов одно и то же для обоих внешних ключей.
Это не единственная проблема, решаемая с помощью составных ключей.
Да-да, помню эту вашу страсть к составным первичным ключам, которые якобы решают дополнительные проблемы корректности данных в БД. При этом вы отвергаете решения с проверкой в триггере и утверждаете, что ваше решение как минимум не хуже.
Берусь показать, что в данном случае ваше решение не только не лучше решения с проверкой в триггере, но и потенциально опаснее его.
Пусть в вашей БД есть вот примерно такие данные
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CONSUMPTIONS:
OP_NO	MAT_NO
 6 	 3 
 7 	 17 
 7 	 20 

PRODUCTIONS:
OP_NO	MAT_NO
 25 	 17 
 26 	 20 
 27 	 100 
 28 	 20 
Пусть в PASSINGS есть запись
OP_SRC=26 OP_DST=7 MAT_NO=20

Теперь представим редактирование этой записи, а именно — смену производящей операции на другую (типа ошиблись при вводе, надо исправить). Например, надо ошибочный внешний ключ (OP_SRC=26 MAT_NO=20) сменить на правильный (OP_SRC=28 MAT_NO=20) . Чтобы редактирование происходило корректно, надо чтобы при смене любой из операций материал оставался одинаковым для обеих операций. Если при редактировании допустить ошибку, что произойдет? Если попытаться FK (OP_SRC=26 MAT_NO=20) заменить на (OP_SRC=27 MAT_NO=100) , то оба варианта, и ваш на ключах, и «наш» на триггере, обнаружат ошибку и отвергнут попытку изменения, т.к. не существует (OP_DST=7 MAT_NO=100) .
А вот если ошибиться так: присвоить FK (OP_SRC=25 MAT_NO=17) ? Вариант на триггере может установить ошибку, т.к. два FK после редактирования будут ссылаться на записи с разными MAT_NO. А вот ваш вариант на «суперключе» ошибки не заметит, т.к. неправильный FK (OP_SRC=25 MAT_NO=17) «перетрет» общее значение MAT_NO на 17, а пара (OP_ DST =7 MAT_NO=17) существует.
...
Рейтинг: 0 / 0
Составной PK
    #32855007
Semaphore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mirДа-да, помню эту вашу страсть к составным первичным ключам, которые якобы решают дополнительные проблемы корректности данных в БД.Что сие означает: "дополнительные проблемы корректности"?
mirПри этом вы отвергаете решения с проверкой в триггере и утверждаете, что ваше решение как минимум не хуже.Даже, больше! Я утверждаю, что такое решение значительно лучше.
mirБерусь показать, что в данном случае ваше решение не только не лучше решения с проверкой в триггере, но и потенциально опаснее его.Любопытно!
mirА вот если ошибиться так: присвоить FK (OP_SRC=25 MAT_NO=17) ? Вариант на триггере может установить ошибку, т.к. два FK после редактирования будут ссылаться на записи с разными MAT_NO. А вот ваш вариант на «суперключе» ошибки не заметит, т.к. неправильный FK (OP_SRC=25 MAT_NO=17) «перетрет» общее значение MAT_NO на 17, а пара (OP_ DST =7 MAT_NO=17) существуетДавайте рассмотрим эту ситуацию. Вы исходите из того, что меняется сразу пара значений. А на каком основании? Возможны следующие сценарии:
1. Пользователь хотел сменить только «операцию-производитель» - источник, откуда поступает даный материал . Тогда зачем он меняет сам материал? Непонятно.
2. Пользователь хотел сменить только материал поставляемый из данного источника . Тогда зачем он меняет операцию-источник?
3. И, наконец, вот оно разумное объяснение действа! Пользователь хотел сменить и операцию, и материал, тогда, что же некорректного в его действиях, почему Ваш триггер решил пресечь его действия? На каком основании? Вы же сами пишите, что операция-потребитель нуждается в этом материале: mirа пара (OP_ DST =7 MAT_NO=17) существуетОбъясните, пожалуйста, почему Ваша схема запрещает выполнять корректное (во всех смыслах) действие. И почему Вы ставите это ей в заслугу?
...
Рейтинг: 0 / 0
Составной PK
    #32855036
mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SemaphoreЧто сие означает: "дополнительные проблемы корректности"?
А то, что первичные ключи по определению обязаны обеспечивать только уникальность записей в таблице, а внешние - ссылочную целостность. Как естественные, так и суррогатные, как простые, так и составные ключи эти задачи решают. Какие-либо другие задачи PK и FK решать не обязаны. По определению. Точка. Поэтому ваши хитроумные пересекающиеся ключи есть трюк , с помощью которого вы пытаетесь решить дополнительные задачи корректности данных.

SemaphoreВы исходите из того, что меняется сразу пара значений. А на каком основании?
Опаньки! По существу аргументы на нашлись? ОК. Отвечу. Пара значений меняется потому, что это одно целое - внешний ключ. В принципе, этого уже достаточно, но добавлю, что странно будет выглядеть интерфейс, не позволяющий выбирать и присваивать внешний ключ целиком. А интерфейс, позволяющий выбирать и присваивать куски составного внешнего ключа вообще будет выглядеть по-идиотски.
SemaphoreОбъясните, пожалуйста, почему Ваша схема запрещает выполнять корректное (во всех смыслах) действие. И почему Вы ставите это ей в заслугу?
Да вы просто молодец! Действие, по определению обявленное ошибочным, вы называете корректным во всех смыслах. До чего люди не доходят, чтобы не признавать своих ошибок!
Дальнейшее участие в дискусии считаю бессмысленным. Всего доброго.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Составной PK
    #36329878
guest07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://baks.gaz.ru/oradoc/ora/ora368.htm
Первичный ключ - составной или суррогатный? (Ответ Тома Кайта)
...
Рейтинг: 0 / 0
Составной PK
    #36329899
guest07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Составной PK
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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