|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
softwarer Впрочем, это отдельная странность, а с точки зрения ключа - ну текстовое и текстовое, вопрос прежний. Не странность. Т.к. обычно может быть +100500 вариантов, все из которых занести в справочник не реально, да и не нужно Ну и нафига это тащить в индекс? Да и для связи N:N в любом случае нужно минимум два индекса, ID с одной стороны и ID с другой стороны, а вот ценность составного индекса мне не очень понятна. === дискуссия "суррогатный ключ" vs "составной индекс" стара как мир ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 16:30 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev а вот ценность составного индекса мне не очень понятна. А тебе его так или иначе делать придется, потому что нужен будет unique по совокупности полей. Иначе у тебя будет, например, что Стенли Кубрик дважды режиссер фильма "Сияние". ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 17:32 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Т.к. обычно может быть +100500 вариантов, все из которых занести в справочник не реально, да и не нужно Помню, как делали систему для ЗАО "Атомстройэкспорт", и тамошний эксперт мне объяснял, что строки О(2) , О(2) (здесь О - русское), и O(II) - это на самом деле одно и то же, все знают, что это чистый кислород и ничего с этим делать не нужно, пусть так и лежат в данных. Я тогда понадеялся, что они никогда не начнут строить свои АЭС в России. Leonid Kudryavtsev Да и для связи N:N в любом случае нужно минимум два индекса Не факт. Leonid Kudryavtsev ID с одной стороны и ID с другой стороны, а вот ценность составного индекса мне не очень понятна Проще всего ответить, что такие таблицы удобно делать индексными. Тогда "составной индекс" - это и есть то место, где лежит основная и единственная копия данных. А основная его функция - ограничение уникальности. Leonid Kudryavtsev дискуссия "суррогатный ключ" vs "составной индекс" стара как мир Это не отменяет того факта, что ответа на вопрос "чем же в данном случае плох составной ключ" так и не прозвучало. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 17:44 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
Суррогатный ключ как минимум достаточно сильно упрощается 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 18:28 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
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). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 18:46 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
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 добавил колонку в конец. Долго искали, в чем же проблема (т.к. делало вид, что работало, но "не все функции выполняло"), потом поняли, что проблема в порядке полей в таблице - пришлось дропать таблицу и создавать поля в нужном порядке ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 19:00 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
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 (дата + время) и моей веры в профессионализм себя и моих коллег, что они запросто могут запихать повторы в СУБД, просто прибавив к "уникальной" дате по одной секунде ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 19:09 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev softwarer "чем же в данном случае плох составной ключ" так и не прозвучало. ... там был уникальный составной ключ "организация" + "тип контакта" ... Это не таблица-развязка. Вопрос был "в данном случае". Примеров того, как какое-то решение неудачно применили в неподходящем случае можно нарыть для чего угодно. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 19:11 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, В случае users - roles самые типовые задачи которые придется решать на клиенте: "определить есть ли роль такая-то у юзера такого-то", "найти все роли в которые входит юзер такой-то", "добавить юзера такого-то в такую-то роль", "убрать юзера такого-то из такой-то роли". Как мне решение этих задач упростит наличие в таблице (user_id, role_id) суррогатного ключа, если уж ты утверждаешь, что с суррогатным ключом проще работать? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 19:38 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Данная сущность в системе Oracle e-Business Suite выглядит примерно так. На самом деле FND_USER_RESP_GROUPS это view, на деле там все хуже ))). Но понятно, что user_id и role_id (resonsibility_id) совершенно спокойно (в OeBS) могут повторятся и это хорошо! Если мне в таблице не нужен весь этот хлам от OEBS, то все равно суррогат добавлять? Я совершенно не против суррогатов там где они оправданы (там где каждая запись в таблице представляет собой действительно отдельную, уникальную сущность), но, просто я регулярно вижу, как эти суррогаты, словно обдолбавшись наркотой тупо пихают во все таблицы без исключения, это пипец, потом смотришь и такое впечатление, как мартышка какая-то сидела и со стеклянными глазами мышкой тыкала в SSMS, pgadmin, или что-нибудь подобное, добавляя поле id везде где его нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 19:49 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
fkthat Leonid Kudryavtsev Данная сущность в системе Oracle e-Business Suite выглядит примерно так. На самом деле FND_USER_RESP_GROUPS это view, на деле там все хуже ))). Но понятно, что user_id и role_id (resonsibility_id) совершенно спокойно (в OeBS) могут повторятся и это хорошо! Если мне в таблице не нужен весь этот хлам от OEBS, то все равно суррогат добавлять? Я совершенно не против суррогатов там где они оправданы (там где каждая запись в таблице представляет собой действительно отдельную, уникальную сущность), но, просто я регулярно вижу, как эти суррогаты, словно обдолбавшись наркотой тупо пихают во все таблицы без исключения, это пипец, потом смотришь и такое впечатление, как мартышка какая-то сидела и со стеклянными глазами мышкой тыкала в SSMS, pgadmin, или что-нибудь подобное, добавляя поле id везде где его нет. Справедливости ради, в моем конкретном сценарии это вылилось в преимущество. При импорте данных из такой системы есть гарантия, что любая строка любой таблицы может быть найдена по своему SourceId. Компактно, единообразно, действительно удобно, когда пришлось делать консолидацию данных из нескольких систем в одной таблице и мэппинги дубликатов. Но, конечно, проектировать БД с расчетом на то, чтобы из нее удобно было DWH делать, и пофиг на все остальное - это я не знаю, кем надо быть. А вообще, мне не очень понятно, о чем спор. Какая разница, делать PK на составном или суррогатном ключе, если единственное, что действительно имеет значение в данном случае - на каких столбцах делается кластерный ключ? Разве что какие-нибудь замшелые СУБД не позволяют FK ссылаться на что-либо, кроме PK, ну разве что... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2020, 07:51 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
КМК, популярность суррогатных ключей резко возросла после того как массово стали использоваться ORM-фреймворки, так как в большинстве они не умеют иначе. Каждая сущность в них завязана на таблицу и обязана иметь простой уникальный идентификатор. Результат такого подхода не сильно радует при ближайшем рассмотрении. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2020, 12:24 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
ChA КМК, популярность суррогатных ключей резко возросла после того как массово стали использоваться ORM-фреймворки, так как в большинстве они не умеют иначе. Каждая сущность в них завязана на таблицу и обязана иметь простой уникальный идентификатор. Результат такого подхода не сильно радует при ближайшем рассмотрении. Проблема составных ключей не только в ORM. Наибольшее неудобство составных ключей возникает, когда на такую таблицу нужно откуда-то сослаться. В этом случае 1. Во всех внешний таблицах замножается количество полей-ссылок 2. Во всех джойнах (и прочих аплаях) нужно указывать большее количество полей в on/where 3. "Читабельность" такого джойна падает, т.к. по тексту запроса не понятно, является ли это джойн по PK или нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2020, 13:07 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
ChA КМК, популярность суррогатных ключей резко возросла после того как массово стали использоваться ORM-фреймворки, так как в большинстве они не умеют иначе. Каждая сущность в них завязана на таблицу и обязана иметь простой уникальный идентификатор. Результат такого подхода не сильно радует при ближайшем рассмотрении. EF от рождения нормально работает с композитными ключами, насчет хиберната точно не знаю - не особый специалист по нему, но, судя по тому, сколько ему лет, там такие вещи тоже давным-давно решены. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2020, 13:28 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
msLex ChA КМК, популярность суррогатных ключей резко возросла после того как массово стали использоваться ORM-фреймворки, так как в большинстве они не умеют иначе. Каждая сущность в них завязана на таблицу и обязана иметь простой уникальный идентификатор. Результат такого подхода не сильно радует при ближайшем рассмотрении. Проблема составных ключей не только в ORM. Наибольшее неудобство составных ключей возникает, когда на такую таблицу нужно откуда-то сослаться. В этом случае 1. Во всех внешний таблицах замножается количество полей-ссылок 2. Во всех джойнах (и прочих аплаях) нужно указывать большее количество полей в on/where 3. "Читабельность" такого джойна падает, т.к. по тексту запроса не понятно, является ли это джойн по PK или нет. Составные ключи всегдла встречал только либо в таблицах-связках (типа user_roles), либо в подчиненных таблицах (типа order_details) - а на такие таблицы редко кто когда ссылаться будет, мн даже тяжело такой сценарий выдумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2020, 13:31 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
fkthat msLex пропущено... Проблема составных ключей не только в ORM. Наибольшее неудобство составных ключей возникает, когда на такую таблицу нужно откуда-то сослаться. В этом случае 1. Во всех внешний таблицах замножается количество полей-ссылок 2. Во всех джойнах (и прочих аплаях) нужно указывать большее количество полей в on/where 3. "Читабельность" такого джойна падает, т.к. по тексту запроса не понятно, является ли это джойн по PK или нет. Составные ключи всегдла встречал только либо в таблицах-связках (типа user_roles), либо в подчиненных таблицах (типа order_details) - а на такие таблицы редко кто когда ссылаться будет, мн даже тяжело такой сценарий выдумать. Например, список примененных скидок на позицию в документе ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2020, 13:37 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
msLex Наибольшее неудобство составных ключей возникает, когда на такую таблицу нужно откуда-то сослаться. Причём по бизнес-логике в подчинённой таблице эти поля не нужны. Именно так. С другой стороны, в развязках это зачастую становится фичой, поскольку позволяет "пробрасывать" ограничения целостности, которые иначе было бы сложно реализовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2020, 13:47 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
msLex fkthat пропущено... Составные ключи всегдла встречал только либо в таблицах-связках (типа user_roles), либо в подчиненных таблицах (типа order_details) - а на такие таблицы редко кто когда ссылаться будет, мн даже тяжело такой сценарий выдумать. Например, список примененных скидок на позицию в документе Да, вполне норм пример. Но, лично я, как раз бы, для списка айтемов заказа композитный ключ и не делал - айтем заказа, это все-таки отдельная сущность, а я уже выше писал, что для отдельной сущности, на мой взгляд, как раз лучше суррогатный ключ. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2020, 13:49 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
fkthat Составные ключи всегдла встречал только либо в таблицах-связках (типа user_roles), либо в подчиненных таблицах (типа order_details) - а на такие таблицы редко кто когда ссылаться будет, мн даже тяжело такой сценарий выдумать. На order_lines (OeBS аналог Вашего order_details) - редко кто когда ссылаться будет и тяжяло даже такой сцераий выдумать ? Резервирование на складе, отгрузка, последующие строки счет-фактура - все будет ссылаться как раз на order_lines IMHO & AFAIK привожу примеры тех. систем, которые видел ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2020, 15:27 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
softwarer msLex Наибольшее неудобство составных ключей возникает, когда на такую таблицу нужно откуда-то сослаться. Причём по бизнес-логике в подчинённой таблице эти поля не нужны. Да, это верное уточнение. softwarer С другой стороны, в развязках это зачастую становится фичой, поскольку позволяет "пробрасывать" ограничения целостности, которые иначе было бы сложно реализовать. Если части этого составного ключа нужны в каких-либо ограничениях целостности, то они уже нужны по бизнес-логике ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2020, 18:14 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov fkthatКак так может "ключ отсутствовать". Легко. Если контроль уникальности связи не нужен или (как чаще всего и происходит) мешает - его убивают. Помеха, обеспечивающая уникальность, нам мешала (чем?) и мы её устранили! Теперь лепи связи одинаковые сколько душе угодно! Особенно интересно станет, если выполнишь по этим связям Join, Узришь "настоящее фантомное" размножение :-( ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 20:05 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
softwarer Это чтобы "режиссёр" можно было написать с грамматической ошибкой? Да! Роль = "рыжий сёр" или "рыж и сер" :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 20:12 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev что они запросто могут запихать повторы в СУБД, просто прибавив к "уникальной" дате по одной секунде ))) Чтобы этого не произошло нужно использовать ограничение типа CHECK Для Oracle это было бы так: Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 20:19 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Hibernate потребовал, что бы все поля составного примари кей шли последовательно и в заданном порядке, а alter table ... add добавил колонку в конец. Это проблема (баг) Hibernate. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 20:22 |
|
первичный ключ(Primary Key)
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Данная сущность в системе Oracle e-Business Suite OEBS несет в себе тяжелое наследие Oracle Database, когда она ещё не поддерживала декларативные ограничения целостности. Так что в качестве эталона для проектирования систем OEBS "не катит". Думаю, что там самые непредсказуемые несуразные вещи имеются. Зато консультанты по внедрению и сопровождению всегда при деле и при деньгах! :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 20:27 |
|
|
start [/forum/search_topic.php?author=jgbobby&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 5000ms |
total: | 5187ms |
0 / 0 |