powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / первичный ключ(Primary Key)
57 сообщений из 57, показаны все 3 страниц
первичный ключ(Primary Key)
    #39979299
neteurt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может ли быть в одной таблице несколько Primary Key ?
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979316
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neteurt
Может ли быть в одной таблице несколько Primary Key ?
Нет, не может. Но может быть один ПК из нескольких полей.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979319
neteurt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

т.е. это будет составной ключ. как это тогда на схеме будет отображаться, напротив каждого поля будет выставлен pk?
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979323
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neteurt
miksoft,

т.е. это будет составной ключ. как это тогда на схеме будет отображаться, напротив каждого поля будет выставлен pk?
Наверное, да. Это уже вопрос к тому ПО, в котором вы это смотрите.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979353
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neteurt,

PowerDesigner? В данном случае это один PK из трех полей, каждое из которых ссылается на другие таблицы.

Поэтому у вас всего один pk, но три разных внешних ключа fk1, fk2, fk3.

Больше одного PK на таблицу сделать нельзя, но вы можете делать альтернативные ключи (AK, они же unique constraint). Делаются они в свойствах таблицы, на закладке Keys (первичный ключ будет там же).

Ограничения на количество АК обычно есть, но зависят от СУБД.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979777
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neteurt,

на картинке, ИМХО, дичь какая-то. Составно pk, завязанный на разные fk?
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979802
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
neteurt,

на картинке, ИМХО, дичь какая-то. Составно pk, завязанный на разные fk?

И в чём дичь?
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979816
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
на картинке, ИМХО, дичь какая-то. Составно pk, завязанный на разные fk?

Обычная тернарная связь между тремя разными сущностями. Например, "команда - чемпионат - стадион"
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979865
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно у таблиц связи первичный ключ суррогатный или вообще отсутствует.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979879
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Обычно у таблиц связи первичный ключ суррогатный или вообще отсутствует.

Да ну? Как так может "ключ отсутствовать". Таблицы связи как раз обычно и состоят только из одного составного , а не суррогатного ключа.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979896
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatКак так может "ключ отсутствовать".

Легко. Если контроль уникальности связи не нужен или (как чаще всего и происходит) мешает
- его убивают.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979908
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Обычно у таблиц связи первичный ключ суррогатный или вообще отсутствует.

Судя по этой реплике, у Вас какая-то очень необычная реальность.

Dimitry Sibiryakov
или (как чаще всего и происходит) мешает

Видал я танцоров, которым ограничения целостности мешают :)
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979916
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВидал я танцоров, которым ограничения целостности мешают :)

А таблицы связей у которых завелись дополнительные атрибуты, делающие связь неуникальной?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979932
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

softwarerВидал я танцоров, которым ограничения целостности мешают :)

А таблицы связей у которых завелись дополнительные атрибуты, делающие связь неуникальной?..

Тогда суррогатный, т.к. это по сути отдельная сущность. Но я такое редко видел, хотя аттрибуты дополнительные часто бывают.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979943
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё когда дело доходит до конкретного DDL, конкретная СУБД хочет создать для первичного
ключа конкретный индекс. И вот тут-то теория иногда начинает нервно озираться, ища пути к
отступлению.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979956
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А таблицы связей у которых завелись дополнительные атрибуты, делающие связь неуникальной?..

Вот прямо-таки неуникальной? Я очень редко видел необходимость в таблицах с неуникальными строками. Не уверен, что вообще видел. Чаще добавляемый атрибут просто должен войти в уникальный ключ.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979966
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Вот прямо-таки неуникальной? Я очень редко видел необходимость в таблицах с неуникальными строками. Не уверен, что вообще видел. Чаще добавляемый атрибут просто должен войти в уникальный ключ.

Представить себе такое можно, но это будет уже скорее не связь, а отдельная сущность.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979970
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Dimitry Sibiryakov
А таблицы связей у которых завелись дополнительные атрибуты, делающие связь неуникальной?..

Вот прямо-таки неуникальной? Я очень редко видел необходимость в таблицах с неуникальными строками. Не уверен, что вообще видел. Чаще добавляемый атрибут просто должен войти в уникальный ключ.


Много случаев, когда в таблице связи N:N нужны дополнительные поля с информацией (да пусть и просто комментарий) и смысла включать эти поля в PK нет никакого (как минимум по той простой причине, что они могут редактироваться).

Делать не суррогатные ПК в таблице связей N:N на мой взгляд скорее антипатерн, чем best practics. На проблемы с составмыми ключами нарывался, а вот достоинств (кроме экономии места под суррогатный ключ) лично я не вижу.

IMHO & AFAIK
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979975
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
На проблемы с составмыми ключами нарывался, а вот достоинств (кроме экономии места под суррогатный ключ) лично я не вижу.

Если у меня таблицы users и roles и таблица-связка M-2-M user_roles то за каким лешим мне кроме составного ключа (user_id, role_id) добавлять туда еще и суррогатный? Какие проблемы могут тут быть из-за составного? Это какая-то чисто, я замечал, есть у многих привычка - не приходя в сознание первым делом пихать в любую таблицу без разбора суррогатный ключ.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979989
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
произведение - персона (автор) - роль в данном произведении

Пусть БД фильмов, роли могут быть: продюсер, режиссер, звукооператор, композитор и так далее
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39979997
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
На проблемы с составмыми ключами нарывался, а вот достоинств (кроме экономии места под суррогатный ключ) лично я не вижу.

Не надо создавать дополнительный индекс и не надо делать Key Lookup во время запроса - это можно отнести в достоинства?
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980005
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Пусть БД фильмов, роли могут быть: продюсер, режиссер, звукооператор, композитор и так далее

И чем же здесь плох составной ключ?
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980009
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у Вас все связи N:N вида

TABLE1_ID number
TABLE2_ID number

я Вам завидую ))). В тех системах, которые я вижу/видел, такой "классический" случай скорее редкость и исключение. В 90% таблиц-связей есть еще какая-то информация, часто, там ее даже __больше__, чем в "основных" таблицах
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980011
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
И чем же здесь плох составной ключ?

И какие колонки в составной ключ?
особенно если роль - текстовое поле, или и то и другое (и справочник и текстовое поле)
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980014
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
И какие колонки в составной ключ?

Произведение, персона, роль. Это если, конечно, Вы не хотите хранить информацию о том, что Вася Пупкин - три раза режиссёр фильма "Пупырышки".

Leonid Kudryavtsev
особенно если роль - текстовое поле

Это чтобы "режиссёр" можно было написать с грамматической ошибкой? Впрочем, это отдельная странность, а с точки зрения ключа - ну текстовое и текстовое, вопрос прежний.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980023
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

Впрочем, это отдельная странность, а с точки зрения ключа - ну текстовое и текстовое, вопрос прежний.

Не странность. Т.к. обычно может быть +100500 вариантов, все из которых занести в справочник не реально, да и не нужно

Ну и нафига это тащить в индекс?

Да и для связи N:N в любом случае нужно минимум два индекса, ID с одной стороны и ID с другой стороны, а вот ценность составного индекса мне не очень понятна.

===

дискуссия "суррогатный ключ" vs "составной индекс" стара как мир
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980050
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
а вот ценность составного индекса мне не очень понятна.

А тебе его так или иначе делать придется, потому что нужен будет unique по совокупности полей. Иначе у тебя будет, например, что Стенли Кубрик дважды режиссер фильма "Сияние".
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980057
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Т.к. обычно может быть +100500 вариантов, все из которых занести в справочник не реально, да и не нужно

Помню, как делали систему для ЗАО "Атомстройэкспорт", и тамошний эксперт мне объяснял, что строки О(2) , О(2) (здесь О - русское), и O(II) - это на самом деле одно и то же, все знают, что это чистый кислород и ничего с этим делать не нужно, пусть так и лежат в данных. Я тогда понадеялся, что они никогда не начнут строить свои АЭС в России.

Leonid Kudryavtsev
Да и для связи N:N в любом случае нужно минимум два индекса

Не факт.

Leonid Kudryavtsev
ID с одной стороны и ID с другой стороны, а вот ценность составного индекса мне не очень понятна

Проще всего ответить, что такие таблицы удобно делать индексными. Тогда "составной индекс" - это и есть то место, где лежит основная и единственная копия данных. А основная его функция - ограничение уникальности.

Leonid Kudryavtsev
дискуссия "суррогатный ключ" vs "составной индекс" стара как мир

Это не отменяет того факта, что ответа на вопрос "чем же в данном случае плох составной ключ" так и не прозвучало.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980085
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суррогатный ключ как минимум достаточно сильно упрощается API внутри приложения

note: разумеется сильно/не сильно понятие субективное

softwarer
Это не отменяет того факта, что ответа на вопрос "чем же в данном случае плох составной ключ" так и не прозвучало.

Он не плох.

Просто он не сильно и нужен (даже без связи с суррогатным ключем), если нет обязательного требования контроля уникальности в базе. Но так как обычно требования на validation сильно сложнее, чем просто уникальность, то в большинстве случаев и для validation он не сильно поможет AFAIK

22167727

fkthat
А тебе его так или иначе делать придется, потому что нужен будет unique по совокупности полей. Иначе у тебя будет, например, что Стенли Кубрик дважды режиссер фильма "Сияние".

В 90% случаев, это не настолько большая проблемма по сравнению с тем, что система не дает ввести Стэнли Кубрик дважды в тех случаях, когда это требуется )))
/он и продюсер и режиссер/

fkthat
Если у меня таблицы users и roles и таблица-связка M-2-M user_roles то за каким лешим мне кроме составного ключа (user_id, role_id) добавлять туда еще и суррогатный?

Данная сущность в системе Oracle e-Business Suite выглядит примерно так. На самом деле FND_USER_RESP_GROUPS это view, на деле там все хуже ))). Но понятно, что user_id и role_id (resonsibility_id) совершенно спокойно (в OeBS) могут повторятся и это хорошо!

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> desc FND_USER_RESP_GROUPS
Name                          Type       Nullable Default Comments 
----------------------------- ---------- -------- ------- -------- 
USER_ID                       NUMBER(15)                           
RESPONSIBILITY_ID             NUMBER     Y                         
RESPONSIBILITY_APPLICATION_ID NUMBER     Y                         
SECURITY_GROUP_ID             NUMBER     Y                         
START_DATE                    DATE       Y                         
END_DATE                      DATE       Y                         
DESCRIPTION                   VARCHAR2   Y                         
CREATED_BY                    NUMBER     Y                         
CREATION_DATE                 DATE       Y                         
LAST_UPDATED_BY               NUMBER     Y                         
LAST_UPDATE_DATE              DATE       Y                         
LAST_UPDATE_LOGIN             NUMBER     Y                         
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980088
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Он не плох. Просто он не сильно и нужен

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

Leonid Kudryavtsev
Но так как обычно требования на validation сильно сложнее, чем просто уникальность

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

Leonid Kudryavtsev
Но понятно, что user_id и role_id (resonsibility_id) совершенно спокойно могут повторятся

А user_id, role_id и start_date - нет (responsibility_application_id я здесь предполагаю денормализацией от responsibility_id).
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980092
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

На проблемы с составными ключами нарывался

softwarer
"чем же в данном случае плох составной ключ" так и не прозвучало.

Была потребность в Oracle CC&B заводить для организации не один контактный телефон, а несколько ))) Поскольку Oracle CC&B проектировал архитектор с популярной сейчас ориентацией, там был уникальный составной ключ "организация" + "тип контакта" (телефон, e-mail, fax) и ввести два телефона или два e-mail'а было нельзя. Заводить в справочник "тип контакта" телефон1, телефон2...телефон999 и email1, email2...email999 посчитали дичью и решили пилить )))

На удивление, обошлось малой кровью, даже несмотря на то, что во всех процедурах (исходных кодов которых не было) системе передавался составкой ID просто в виде параметров по отдельности. Т.е., если делать "по хорошему", то нужно было бы менять описание/декларации 100500 процедур черт знает в каких местах системы. К счастью это не потребовалось, т.к. хоть параметры внутри системы и прокидывались, к отдельным строчкам таблицы обращение по "полному" primary key никогда не происходило. Весь блок (аккордеон) всегда считывался/записывался целиком.

Но встретили один "нежданчик". Hibernate потребовал, что бы все поля составного примари кей шли последовательно и в заданном порядке, а alter table ... add добавил колонку в конец. Долго искали, в чем же проблема (т.к. делало вид, что работало, но "не все функции выполняло"), потом поняли, что проблема в порядке полей в таблице - пришлось дропать таблицу и создавать поля в нужном порядке
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980098
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

Leonid Kudryavtsev
Но понятно, что user_id и role_id (resonsibility_id) совершенно спокойно могут повторятся

А user_id, role_id и start_date - нет (responsibility_application_id я здесь предполагаю денормализацией от responsibility_id).

1. для меня это не очевидно
2. у меня личная непереносимость использования date в качестве (или наподобие) id
особенно с учетом Oracle date (дата + время) и моей веры в профессионализм себя и моих коллег, что они запросто могут запихать повторы в СУБД, просто прибавив к "уникальной" дате по одной секунде )))
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980101
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
softwarer
"чем же в данном случае плох составной ключ" так и не прозвучало.

... там был уникальный составной ключ "организация" + "тип контакта" ...

Это не таблица-развязка. Вопрос был "в данном случае". Примеров того, как какое-то решение неудачно применили в неподходящем случае можно нарыть для чего угодно.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980116
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

В случае users - roles самые типовые задачи которые придется решать на клиенте: "определить есть ли роль такая-то у юзера такого-то", "найти все роли в которые входит юзер такой-то", "добавить юзера такого-то в такую-то роль", "убрать юзера такого-то из такой-то роли". Как мне решение этих задач упростит наличие в таблице (user_id, role_id) суррогатного ключа, если уж ты утверждаешь, что с суррогатным ключом проще работать?
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980122
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Данная сущность в системе Oracle e-Business Suite выглядит примерно так. На самом деле FND_USER_RESP_GROUPS это view, на деле там все хуже ))). Но понятно, что user_id и role_id (resonsibility_id) совершенно спокойно (в OeBS) могут повторятся и это хорошо!

Если мне в таблице не нужен весь этот хлам от OEBS, то все равно суррогат добавлять? Я совершенно не против суррогатов там где они оправданы (там где каждая запись в таблице представляет собой действительно отдельную, уникальную сущность), но, просто я регулярно вижу, как эти суррогаты, словно обдолбавшись наркотой тупо пихают во все таблицы без исключения, это пипец, потом смотришь и такое впечатление, как мартышка какая-то сидела и со стеклянными глазами мышкой тыкала в SSMS, pgadmin, или что-нибудь подобное, добавляя поле id везде где его нет.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980229
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Leonid Kudryavtsev
Данная сущность в системе Oracle e-Business Suite выглядит примерно так. На самом деле FND_USER_RESP_GROUPS это view, на деле там все хуже ))). Но понятно, что user_id и role_id (resonsibility_id) совершенно спокойно (в OeBS) могут повторятся и это хорошо!

Если мне в таблице не нужен весь этот хлам от OEBS, то все равно суррогат добавлять? Я совершенно не против суррогатов там где они оправданы (там где каждая запись в таблице представляет собой действительно отдельную, уникальную сущность), но, просто я регулярно вижу, как эти суррогаты, словно обдолбавшись наркотой тупо пихают во все таблицы без исключения, это пипец, потом смотришь и такое впечатление, как мартышка какая-то сидела и со стеклянными глазами мышкой тыкала в SSMS, pgadmin, или что-нибудь подобное, добавляя поле id везде где его нет.
Сейчас пилю DHW, где одна из исходных систем (Totara LMS) - как раз такая, как вы описали . 600+ таблиц, и во всех до единой присутствует "id bigserial primary key".

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

Но, конечно, проектировать БД с расчетом на то, чтобы из нее удобно было DWH делать, и пофиг на все остальное - это я не знаю, кем надо быть.

А вообще, мне не очень понятно, о чем спор. Какая разница, делать PK на составном или суррогатном ключе, если единственное, что действительно имеет значение в данном случае - на каких столбцах делается кластерный ключ? Разве что какие-нибудь замшелые СУБД не позволяют FK ссылаться на что-либо, кроме PK, ну разве что...
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980379
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КМК, популярность суррогатных ключей резко возросла после того как массово стали использоваться ORM-фреймворки, так как в большинстве они не умеют иначе. Каждая сущность в них завязана на таблицу и обязана иметь простой уникальный идентификатор. Результат такого подхода не сильно радует при ближайшем рассмотрении.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980410
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA
КМК, популярность суррогатных ключей резко возросла после того как массово стали использоваться ORM-фреймворки, так как в большинстве они не умеют иначе. Каждая сущность в них завязана на таблицу и обязана иметь простой уникальный идентификатор. Результат такого подхода не сильно радует при ближайшем рассмотрении.

Проблема составных ключей не только в ORM.
Наибольшее неудобство составных ключей возникает, когда на такую таблицу нужно откуда-то сослаться. В этом случае
1. Во всех внешний таблицах замножается количество полей-ссылок
2. Во всех джойнах (и прочих аплаях) нужно указывать большее количество полей в on/where
3. "Читабельность" такого джойна падает, т.к. по тексту запроса не понятно, является ли это джойн по PK или нет.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980426
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA
КМК, популярность суррогатных ключей резко возросла после того как массово стали использоваться ORM-фреймворки, так как в большинстве они не умеют иначе. Каждая сущность в них завязана на таблицу и обязана иметь простой уникальный идентификатор. Результат такого подхода не сильно радует при ближайшем рассмотрении.

EF от рождения нормально работает с композитными ключами, насчет хиберната точно не знаю - не особый специалист по нему, но, судя по тому, сколько ему лет, там такие вещи тоже давным-давно решены.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980430
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
ChA
КМК, популярность суррогатных ключей резко возросла после того как массово стали использоваться ORM-фреймворки, так как в большинстве они не умеют иначе. Каждая сущность в них завязана на таблицу и обязана иметь простой уникальный идентификатор. Результат такого подхода не сильно радует при ближайшем рассмотрении.

Проблема составных ключей не только в ORM.
Наибольшее неудобство составных ключей возникает, когда на такую таблицу нужно откуда-то сослаться. В этом случае
1. Во всех внешний таблицах замножается количество полей-ссылок
2. Во всех джойнах (и прочих аплаях) нужно указывать большее количество полей в on/where
3. "Читабельность" такого джойна падает, т.к. по тексту запроса не понятно, является ли это джойн по PK или нет.

Составные ключи всегдла встречал только либо в таблицах-связках (типа user_roles), либо в подчиненных таблицах (типа order_details) - а на такие таблицы редко кто когда ссылаться будет, мн даже тяжело такой сценарий выдумать.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980432
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
msLex
пропущено...

Проблема составных ключей не только в ORM.
Наибольшее неудобство составных ключей возникает, когда на такую таблицу нужно откуда-то сослаться. В этом случае
1. Во всех внешний таблицах замножается количество полей-ссылок
2. Во всех джойнах (и прочих аплаях) нужно указывать большее количество полей в on/where
3. "Читабельность" такого джойна падает, т.к. по тексту запроса не понятно, является ли это джойн по PK или нет.

Составные ключи всегдла встречал только либо в таблицах-связках (типа user_roles), либо в подчиненных таблицах (типа order_details) - а на такие таблицы редко кто когда ссылаться будет, мн даже тяжело такой сценарий выдумать.


Например, список примененных скидок на позицию в документе
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980438
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Наибольшее неудобство составных ключей возникает, когда на такую таблицу нужно откуда-то сослаться.

Причём по бизнес-логике в подчинённой таблице эти поля не нужны. Именно так. С другой стороны, в развязках это зачастую становится фичой, поскольку позволяет "пробрасывать" ограничения целостности, которые иначе было бы сложно реализовать.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980442
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
fkthat
пропущено...

Составные ключи всегдла встречал только либо в таблицах-связках (типа user_roles), либо в подчиненных таблицах (типа order_details) - а на такие таблицы редко кто когда ссылаться будет, мн даже тяжело такой сценарий выдумать.


Например, список примененных скидок на позицию в документе

Да, вполне норм пример. Но, лично я, как раз бы, для списка айтемов заказа композитный ключ и не делал - айтем заказа, это все-таки отдельная сущность, а я уже выше писал, что для отдельной сущности, на мой взгляд, как раз лучше суррогатный ключ.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980510
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Составные ключи всегдла встречал только либо в таблицах-связках (типа user_roles), либо в подчиненных таблицах (типа order_details) - а на такие таблицы редко кто когда ссылаться будет, мн даже тяжело такой сценарий выдумать.


На order_lines (OeBS аналог Вашего order_details) - редко кто когда ссылаться будет и тяжяло даже такой сцераий выдумать ?

Резервирование на складе, отгрузка, последующие строки счет-фактура - все будет ссылаться как раз на order_lines

IMHO & AFAIK
привожу примеры тех. систем, которые видел
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39980589
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
msLex
Наибольшее неудобство составных ключей возникает, когда на такую таблицу нужно откуда-то сослаться.

Причём по бизнес-логике в подчинённой таблице эти поля не нужны.


Да, это верное уточнение.

softwarer

С другой стороны, в развязках это зачастую становится фичой, поскольку позволяет "пробрасывать" ограничения целостности, которые иначе было бы сложно реализовать.



Если части этого составного ключа нужны в каких-либо ограничениях целостности, то они уже нужны по бизнес-логике
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39981996
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

fkthatКак так может "ключ отсутствовать".

Легко. Если контроль уникальности связи не нужен или (как чаще всего и происходит) мешает
- его убивают.
Помеха, обеспечивающая уникальность, нам мешала (чем?) и мы её устранили!

Теперь лепи связи одинаковые сколько душе угодно!

Особенно интересно станет, если выполнишь по этим связям Join,
Узришь "настоящее фантомное" размножение :-(
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39982000
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Это чтобы "режиссёр" можно было написать с грамматической ошибкой?

Да! Роль = "рыжий сёр" или "рыж и сер" :-)
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39982004
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
что они запросто могут запихать повторы в СУБД, просто прибавив к "уникальной" дате по одной секунде )))

Чтобы этого не произошло нужно использовать ограничение типа CHECK
Для Oracle это было бы так:
Код: sql
1.
2.
3.
-- Допустимы только даты с точностью до дня (без времени)
... CONSTRAINT constraint_name
      CHECK (date_field = TRUNC(date_field))
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39982008
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Hibernate потребовал, что бы все поля составного примари кей шли последовательно и в заданном порядке, а alter table ... add добавил колонку в конец.
Это не проблема составного ключа.
Это проблема (баг) Hibernate.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39982013
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Данная сущность в системе Oracle e-Business Suite

OEBS несет в себе тяжелое наследие Oracle Database, когда она ещё не поддерживала декларативные ограничения целостности.
Так что в качестве эталона для проектирования систем OEBS "не катит".
Думаю, что там самые непредсказуемые несуразные вещи имеются.

Зато консультанты по внедрению и сопровождению всегда при деле и при деньгах! :-)
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39982015
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael
Но, конечно, проектировать БД с расчетом на то, чтобы из нее удобно было DWH делать, и пофиг на все остальное - это я не знаю, кем надо быть.

А как насчет "проектировать БД, нисколько не думая о том, чтобы из нее удобно было DWH делать, и пофиг на этот DWH"?

Вы же знаете, что руководство, от которого в наибольшей степени зависит ваша зарплата,
Для принятия решений пользуется именно сведениями, получаемыми из DWH, а не из оперативных данных.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39982172
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus,

Контора, которая эту систему разрабатывает, сама DWH не пишет. Писать его приходится мне, работая в компании, которая является клиентом сервис-провайдера вендора, с коим у нас договор на услуги тренинга и сертификации сотрудников.

Может, конечно, какие-то отчеты они сами и предоставляют, но тот факт, что старая версия DWH живет уже лет 5 минимум, говорит мне о том, что если те отчеты у вендора и есть, то нашим они не подошли. Иначе никто не стал бы заморачиваться с чем, чтобы каждую ночь скачивать у них дамп базы PG, разворачивать его локально, натравлять на него ETL и потом пересчитывать отчетные таблицы.

Оверхед, конечно, небольшой - 8 байт на строку таблицы, да и то не для каждой таблицы это является оверхедом. Другое дело, что иногда я наблюдаю изменения этих bigserial-ключей в М:М связках при неизменном натуральном ключе. Т.е. они эту запись удаляют и вставляют заново, зачем - непонятно. Если я буду вязаться к этим Id в моем ETL, получу кучу конфликтов вида "Сара Смит 3 раза прошла курс Hand Hygiene в один и тот же день, с точностью до секунды" (на моей стороне SCD + soft delete). Так что они мне не помогают тут ни разу, только место в базе жрут.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39982375
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael
Сейчас пилю DWH, где одна из исходных систем (Totara LMS)


Респект архитектору этой Тотары )
Одним решением снял кучу вопросов по импорту из нее, а импорт есть в 99% случаев.

Ну и заодно тут решается проблема ссылок на эти связочные таблицы, иногда это бывает необходимо.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39982376
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Составные ключи всегдла встречал только либо в таблицах-связках (типа user_roles), либо в подчиненных таблицах (типа order_details) - а на такие таблицы редко кто когда ссылаться будет, мн даже тяжело такой сценарий выдумать.


а мне легко:
- сначала появляется задача добавить комментарий к связкам
- а потом появляется задача связать комментарий еще с чем-то/вывести его где-то
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39982406
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик
- сначала появляется задача добавить комментарий к связкам

Я же уже писал - это тогда уже не связка, а отдельная сущность. Тогда суррогат это именно то, что надо.
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39982796
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Я же уже писал - это тогда уже не связка, а отдельная сущность

Разница больно шаткая

Вот например система биллинга Oracle CC&B, вся их V-model, это одна большая мега-связка между Person и зданием )))

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

IMHO
...
Рейтинг: 0 / 0
первичный ключ(Primary Key)
    #39982799
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

Об том то и речь, что сначала была просто связка, потом добавили комментарий, потом еще что-то.... раз и уже получилась "отдельная сущность".

От всего не застрахуешься. Точно так же может внезапно выясниться, что, допустим, сотрудники иногда меняют адреса, телефоны, фамилии и даже пол, а при этом надо хранить все как новое, так и старое , но не станешь же заводить заранее из-за этого отдельную таблицу вообще под каждый аттрибут.
...
Рейтинг: 0 / 0
57 сообщений из 57, показаны все 3 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / первичный ключ(Primary Key)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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