|
|
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
softwarerИмхо, слово "потенциальный" вполне подчеркивает, что речь идет не о существующем ключе.Ну да. Только после его введения именно этот потенциальный и становится настоящим ключом, а существующий до этого перестает быть таковым, и становится суперключом. Мне казалось, что это очевидно. Именно поэтому 2 решения, которые Вы предложили рассмотреть, являются принципиально разными, а не различаются всего лишь добавлением еще одного ограничения в первом из упомянутых. softwarerИМХО описанная денормализация - основной плюс миграции идентифицирующих атрибутов, и это практически единственный вариант, когда составной ключ может оказаться оправданным.Опять не понимаю. Денормализация появляется только при миграции неидентифицирующих атрибутов, т.е., когда связь происходит не по одному из возможных ключей, а по суперключу. Если же связь происходит именно по ключу, пусть даже составному, то никакой денормализации нет. И оправданность с теоретической точки зрения только одна, это естественно, т.е., не требует появления каких-либо избыточных атрибутов типа суррогатных ключей, происходит в рамках стандартной нормализации и не вызывает никаких дополнительных аномалий. Некоторые же из практических плюсов и минусов использования суррогатных ключей, как альтернативы составных, Вы упоминали ранее, и по ним у нас нет разногласий. Хотя я не сторонник бездумного использования суррогатных ключей. А то доходит до смешного. Делают связь "многие-ко-многим" через дополнительную таблицу и помимо добавленных ключей с каждой стороны в нее громоздят еще один суррогатный ключ. Спроси зачем, ответа не скажут или начинают нести откровенный бред. Одним из таких объяснений является непонятный миф, что таблица обязательно должна иметь суррогатный ключ. Трудно сказать истоки его появления, хотя я лично склонен считать, что из неверно понятого условия обязательности ключа в любой таблице. Впрочем, это уже зыбкая почва предположений и не вижу смысла в нее углубляться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 22:02 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ChA softwarerИмхо, слово "потенциальный" вполне подчеркивает, что речь идет не о существующем ключе.Ну да. Только после его введения именно этот потенциальный и становится настоящим ключом, а существующий до этого перестает быть таковым, :)) Признаться, не припомню, чтобы в теории существовали такие понятия как "настоящий" и "ненастоящий" ключ. Вам в данном случае трудно понять меня потому, что Вы думаете о том, "как должно быть с точки зрения теории", а я - о том, "как есть в приведенном мной примере". При этом похоже, расхождений по сути у нас нет, вопрос исключительно в утрясании формулировок. ChAОдним из таких объяснений является непонятный миф, что таблица обязательно должна иметь суррогатный ключ. Трудно сказать истоки его появления Я бы не назвал это мифом. Имхо это что-то типа принципа унификации; простое, автоматически выполняемое и не требующее размышлений правило, дающее при этом довольно близкий к идеалу результат. Кроме того, я бы предположил, что существенный вклад внесли всякого рода CASE-ы, фреймворки (не понимающие составных ключей), автогенерируемый код (опять же склонный быть реализованным "тупо и просто") итп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 22:28 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
softwarerПризнаться, не припомню, чтобы в теории существовали такие понятия как "настоящий" и "ненастоящий" ключ.Такие понятия действительно отсутствуют, собственно, эти формулировки целиком на Вашей совести. Но условие неизбыточности потенциального ключа упоминается практически во всех изданиях по СУБД, считающихся классическими. По этой причине, по первому решению, комбинация (table#, table_column#) после добавления уникальности на table_column# выходит из категории потенциальных ключей и начинает относиться уже только к категории суперключей. Дейт даже делает специальную оговорку по поводу использования избыточного ключа в качестве внешнего, указывая, что такой подход явно ведет к денормализации, хотя это и так очевидно, чтобы быть поводом для оговорки. Максимальный суперключ, как крайний случай, включает в себя все атрибуты сущности на которой он построен, хотя не исключено, что он при этом останется потенциальным ключом. Впрочем, не вижу смысла мусолить одно и тоже, посему закрываю для себя эту нить обсуждения. Кстати, был не совсем прав, по поводу определения суперключа. Есть немало разночтений этого термина вплоть до абсурдного - эквивалентности понятия "составной ключ" и "суперключ", но заслуживающими внимания, IMHO, можно считать понятия от апологетов или лиц, известных и авторитетных в определенных кругах. По их, в целом, общему мнению, под понятие суперключа подходит любой набор атрибутов, включающий в себя целиком хотя бы один потенциальный ключ. Из этого следует, что вырожденный случай, когда суперключ целиком равен потенциальному ключу также допустим. Впрочем, IMHO, это не принципиально в контексте обсуждаемой темы. В любом смысле, было полезно освежить свои знания. softwarerЯ бы не назвал это мифом. Имхо это что-то типа принципа унификации; простое, автоматически выполняемое и не требующее размышлений правило, дающее при этом довольно близкий к идеалу результат.Понятие идеала - вещь сугубо субъективная и не может быть использовано в качестве объективного критерия. С моей точки зрения, использование суррогатного ключа только потому, что, например, лень указывать несколько условий вместо одного, или боязнь запутаться, или забыть все условия по составному ключу, выглядит несколько абсурдным. Я могу понять эти причины с практической точки зрения, но при этом надо отдавать себе отчет, что такое решение может сильно усложнить работу СУБД. В частности, когда могла бы происходить (а она будет обязательно) связка или были бы условия (а они будут обязательно) по конкретным атрибутам составного ключа, как естественной альтернативы суррогатному. В этом случае Engine будет вынужден выполнять двойную работу: слияние по суррогатному ключу и слияние или проверка условий по атрибутам, которым было отказано в миграции в связи с заменой их множества на суррогатный ключ, или наоборот, но в любом случае - оба действия. А если у нас будет "вложенность" на несколько уровней с заменой миграции на суррогатность на каждом из них ? Боюсь, что в таком случае "унификация" может оказаться чересчур дорогим удовольствием. Не говоря уж о том, что вместо N естественно мигрирующих атрибутов у нас появляется еще того же порядка суррогатных атрибутов в общей схеме. И в запросах могут появиться уже больше условий, чем если бы мы позволили миграцию составных ключей, так кроме условий на них мы вынуждены включать и условия на суррогатные. В связи с вышеупомянутым, лично для меня, замена составных ключей на суррогатные выглядит не столь привлекательно, чтобы хоть в какой-либо степени считать ее близкой к идеалу. IMHO, единственное оправданное применение суррогатных ключей, заключается только в минимизации физических объемов при замене ими естественных ключей. Попутно же решается проблема с потенциальной изменчивостью естественного ключа, но это, скорее, дополнительный бонус, хотя и очень ценный, иногда только ради него происходит подобная замена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 07:01 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
По поводу разгоревшейся дискуссии (про паспорт и инн, нормализацию и заявление mcureenab "пилить") хочу напомнить еще одно золотое правило: не плодить сущности без нужды . Если нашей системе не ставится задача отслеживать историю получения человеком паспортов, то не надо пилить ... ...А может, в нашей системе для идентификации человека номер паспорта вообще не нужен. Тогда и атрибут такой человеку не нужно заводить. ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 07:01 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ChA softwarer ChA softwarerИмхо, слово "потенциальный" вполне подчеркивает, что речь идет не о существующем ключе.Ну да. Только после его введения именно этот потенциальный и становится настоящим ключом, а существующий до этого перестает быть таковым, :)) Признаться, не припомню, чтобы в теории существовали такие понятия как "настоящий" и "ненастоящий" ключ.Такие понятия действительно отсутствуют, собственно, эти формулировки целиком на Вашей совести.Прошу прощения, просмотрел, слово "настоящий" было действительно мною использовано, но, хотелось бы подчеркнуть, что не в качестве термина или понятия, а чтобы донести смысл, так как ряд используемых терминов ранее был признан неизвестным. Так что не вижу смысла в Вашей, несомненно остроумной, реплике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 07:11 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
softwarer ChAОдним из таких объяснений является непонятный миф, что таблица обязательно должна иметь суррогатный ключ. Трудно сказать истоки его появления Я бы не назвал это мифом. Имхо это что-то типа принципа унификации; простое, автоматически выполняемое и не требующее размышлений правило, дающее при этом довольно близкий к идеалу результат.Будем помнить, что такое автоматически выполняемое и не требующее размышлений правило имеет и свой побочный отрицательный эффект. Многие с младых ногтей привыкают без раздумий сразу заводить для таблицы суррогатный ключ (ID..., Код...) и на этом успокаиваются и даже не пытаются искать наличие других потенциальных ключей. А ведь их обязательно надо объявить UNIQUE. Вот и плодятся базы, где внешне нормальная схема (все таблицы имеют ПК) на поверку оказывается г@вном. Я такого на примере своих студентов насмотрелся. Если его (студента) кто-то сразу научил, что каждой таблице надо заводить суррогатный ключ, -- пиши пропало. Этот горе-проектировщик больше о необходимости определять альтернативные ключи никогда не вспомнит. Я к тому, что если какая-то методика проектирования "не требует размышлений" , то от этого может быть вреда не меньше, чем пользы. Размышления все же нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 11:10 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ВАФЫВАВЫАЫФВА mirоказаться от попыток идентификации человека. с определенной (ИМХО достаточной) степенью достоверности можно использовать алгоритм формирования АйДи персоны по сочетанию его ФамилииИмениОтчества - типа Soundex + дата рождения чтобы обойти проблему Русский-Английский можно сначала транслитерировать (можно в бэкграунде - скрыто от пользователя) личные данные с Русского на Английский (алгоритм не то чтобы тривиален, но не сложен ИМХО) и только потом применить для кодирования классический Сандекс... этакий вот квази-суррогатный ключНикому не нужное и нерабочее решение. Если ФИО+Дата уникальны, никакой "АйДи" уже и не нужен. А если он нужен, то правильным решением будет создать суррогатный ключ-счетчик и GUID. Какой смысл заводить "АйДи" как функцию от других атрибутов? Они же могут меняться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 11:17 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
В смысле суррогатный ключ -- счетчик или GUID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 11:20 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ChAС моей точки зрения, использование суррогатного ключа только потому, что, например, лень указывать несколько условий вместо одного, или боязнь запутаться, или забыть все условия по составному ключу, выглядит несколько абсурдным. Я могу понять эти причины с практической точки зрения, но при этом надо отдавать себе отчет, что такое решение может сильно усложнить работу СУБД. На моей практике, при прочих равных, усложняло работу с БД именно отсутствие суррогатного PK. Например, в текущем проекте он практически во всех таблицах есть. Это позволяет(позволило) идентифицировать запись в триггере на изменение при множественном изменении записей, написать единую настраиваемую универсальную функциональность протоколирования на триггерах, реализовать опять же такое же универсальное позаписное разграничение прав доступа, универсальные произвольные дополнительные атрибуты любой записи в БД и многое другое, что нельзя было бы сделать также просто, не будь везде суррогатного PK. В общем, если есть вероятность, что на таблице будет висеть хотя бы один триггер - суррогатный PK создаю без раздумий, альтернативные - как UNIQUE INDEX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 12:12 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов... и многое другое, что нельзя было бы сделать также просто, не будь везде суррогатного PK Собственно, как я и говорил: ".. Кроме того, я бы предположил, что существенный вклад внесли всякого рода CASE-ы, фреймворки (не понимающие составных ключей), автогенерируемый код (опять же склонный быть реализованным "тупо и просто") итп." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 13:17 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
mirЯ к тому, что если какая-то методика проектирования "не требует размышлений" , то от этого может быть вреда не меньше, чем пользы. Размышления все же нужны. Я с этим абсолютно согласен. Но хватает и сторонников противоположного подхода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 13:18 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовНа моей практике, при прочих равных, усложняло работу с БД именно отсутствие суррогатного PK...К тому, что сказал softwarer по этому поводу, мне, в целом, добавить нечего. Вы имеете полное право решать проблемы тем способом, который вас устраивает, я лишь подчеркнул минусы, проистекающие из тотального применения суррогатных ключей. Кстати, насколько я понял, то причины, побудившие Вас к активному использованию суррогатных ключей идут вне контекста обсуждаемой темы - отказа от миграции составного ключа в пользу миграции суррогатного. В контексте решения некоторых частных проблем требующих упрощенной идентификации записей посредством введения суррогатных ключей не вижу смысла. Впрочем, не уверен, что нельзя было бы их решить на более раннем этапе проектирования с помощью традиционных подходов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 15:27 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ChA Сергей Васкецов...В контексте решения некоторых частных проблем требующих упрощенной идентификации записей посредством введения суррогатных ключей не вижу смысла...Прошу прощения, в результате правки смысл фразы сильно изменился. 37.5 0 C не очень хороший помошник :( Правильно так: Если решение некоторых частных проблем требует упрощенной идентификации записей посредством введения суррогатных ключей, то не нахожу в этом сильной беды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 15:37 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
Ввиду того, что проблема чуть ли не повсеместная (длиннющих составной естественный ключ с потенциальной изменчивостью, сам из внешних, необходимость миграции неключевых дальше и т.д.), опять же давно бы решили на уровне СУБД. «Транзитных» и т.п. ключей бы навводили. Вопрос, хоть проверка уникальности PK и UNIQUE INDEX оптимизирована? Или тоже дважды проверяется? Опять же, таблицы вообще без PK – это аномалия, это НЕ МНОЖЕСТВО, дубли только для целей оперирования могут быть. А значит, давно пора суррогатные ключи прошить в подкорку (тут я согласна с «CASE-средствами»), чтобы разработчики занимались только содержанием. И студентов с множествами учить работать, а не с ключами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 19:36 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
YulkaВвиду того, что проблема чуть ли не повсеместная (длиннющих составной естественный ключ с потенциальной изменчивостью, сам из внешних, необходимость миграции неключевых дальше и т.д.), опять же давно бы решили на уровне СУБД.Да, в общем, и нет никакой проблемы. Тем более такой, чтобы решать на уровне СУБД. А что такое "миграции неключевых"? Yulka«Транзитных» и т.п. ключей бы навводили.Это что за зверь такой? YulkaВопрос, хоть проверка уникальности PK и UNIQUE INDEX оптимизирована? Или тоже дважды проверяется?Все нормальные РСУБД для PK автоматически создают UNIQUE INDEX, с помощью которого и проверяется уникальность. "Руками" делать ничего не надо. YulkaОпять же, таблицы вообще без PK – это аномалия, это НЕ МНОЖЕСТВО, дубли только для целей оперирования могут быть.Это абсолютно верно. YulkaА значит, давно пора суррогатные ключи прошить в подкоркуЭто абсолютно неверно. YulkaИ студентов с множествами учить работать, а не с ключами.Это что же за такое противопоставление: множества VS. ключи? Что бы это значило? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 09:02 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ChAОдним из таких объяснений является непонятный миф, что таблица обязательно должна иметь суррогатный ключ. Трудно сказать истоки его появления Все очень просто - это необходимо вытекает из определения понятия Таблица. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 10:47 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
2 Yulka СУБД работает с множествами - адресуемыми элементами данных. Адресное пространство - множество в силу своего устройства. Все проблемы - во взаимодействии с внешним миром. Например, мы знаем, что люди образуют множество, но не имеем возможности эффективно его представить. Более того если однажды установлена связь человека и записи БД, то нет 100% надежного способа эту связь сохранить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 10:54 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
YulkaОпять же, таблицы вообще без PK – это аномалия, это НЕ МНОЖЕСТВО 1. Таблица вообще не множество 2. Пример: поток событий - могут отличаються только порядковым номером, т.е. номером строки таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 10:56 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
мод ChAОдним из таких объяснений является непонятный миф, что таблица обязательно должна иметь суррогатный ключ. Трудно сказать истоки его появления Все очень просто - это необходимо вытекает из определения понятия Таблица.Процитируйте, пожалуйста, это определение и не забудьте указать источник. Что-то мне подсказывает, что ни Кодд, ни Дейт, ни многие другие апологеты с ним незнакомы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 11:48 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
ChAПроцитируйте, пожалуйста, это определение и не забудьте указать источник. Что-то мне подсказывает, что ни Кодд, ни Дейт, ни многие другие апологеты с ним незнакомы.[/quot] Таблица - это массив строк, т.е. каждая строка имеет индекс (какие еще источники . ps поменьше апологетов слушайте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 12:08 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
модТаблица - это массив строк, т.е. каждая строка имеет индекс (какие еще источники Здравствуйте, Андрей Леонидович. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 12:13 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
модТаблица - это массив строк, т.е. каждая строка имеет индекс (какие еще источники . ps поменьше апологетов слушайтеПросто какое-то нашествие практиков от сохи... :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 12:13 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
модТаблица - это массив строк, т.е. каждая строка имеет индекс (какие еще источники Это в принципе верно, если дополнительно требуется условие идентификации любой записи в таблице по подному полю (см. мои примеры выше), что приводит к замечательному следствию, что любая строка в любой таблице в БД идентифицируется по полному имени таблицы и идентификатору строки. Внутри сервера БД такая идентификация есть всегда, но она в большинстве случаев недоступна для разработчика и может меняться со временем. В общем же случае безотносительно требования идентификации - это принципиальная ошибка в рассуждениях, в таблице вообще-то могут быть даже полностью идентичные записи с точки зрения select * from table. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 12:16 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецовчто приводит к замечательному следствию, что любая строка в любой таблице в БД идентифицируется по полному имени таблицы и идентификатору строки. Это не слишком замечательное следствие. Если требуется такое (как правило, для трехзвенок-ормов) то куда удобнее идентифицировать записи без имени таблицы, идентификатором, уникальным в пределах базы (попросту - запитать все таблицы от одного секвенсора). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 12:27 |
|
||
|
Первичный ключ из нескольких внешних
|
|||
|---|---|---|---|
|
#18+
Нда, прямо на глазах от утверждения "нет ничего практичней хорошей теории" не остается ни камня на камне. Сергей Васкецовчто любая строка в любой таблице в БД идентифицируется по полному имени таблицы и идентификатору строки. Внутри сервера БД такая идентификация есть всегда, но она в большинстве случаев недоступна для разработчика и может меняться со временем.Возможно не удивлю Вас, но такой идентификатор далеко не всегда представляет собой простое и однозначные число. Сергей ВаскецовВ общем же случае безотносительно требования идентификации - это принципиальная ошибка в рассуждениях, в таблице вообще-то могут быть даже полностью идентичные записи с точки зрения select * from table.И Кодд может смело идти в сад, РМД здесь рядом не стояла. Действительно, если такое поведение позволяет себе то, что сейчас идет под названием РСУБД, то этого, оказывается, уже достаточно, чтобы считать теоретически обоснованным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 12:36 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34368665&tid=1544689]: |
0ms |
get settings: |
5ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
175ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 495ms |

| 0 / 0 |
