| | | | |
Синтетические и естественные ключи. |
Добрый день.
Может кто поможет мне определиться в том, какие ключи лучше
использовать в качестве первичных - синтетические или
естественные. Я прочитал несколько статей на эту тему, но не
уверен, что пришел к определенным выводам. С одной стороны
преимущество синтетического ключа кажется неоспоримым исходя из
того постулата, что любой объект реального мира подвержен
изменениям, иногда кардинальным. Очень многое из того, что
кажется незыблемым, может меняться и довольно быстро. Трудно
придумать действительно уникальный естественный ключ, например,
возьмем таблицу рабочих предприятия. Что взять в качестве
первичного ключа? Не буду говорить банальности о смене ФИО,
пола, паспорта и т.п. Взять за основу псевдо естественное поле
- табельный номер (ведь для того его и придумали)? А теперь
представьте ситуацию - предприятие работает долго, имеет
обширные архивы на CD-ROM, база эксплуатируется практически
непрерывно (вполне реальные параметры для серьезных баз данных).
Руководство отделов кадров решило, что теперь табельный номер
должен быть не числовой, а текстовой и нести в себе некую доп.
информацию (причем это с точки зрения программиста ситуация
весьма нестандартная, а с точки зрения отдела кадров проста и
менять свои взгляды на формат табельного номера оно может раз в
неделю, кстати, на период становления нового стандарта так оно и
будет). Что делать? Ну, в общем-то "что" понятно, но, боюсь, что
будет плохо и базе и программисту.
С другой стороны в примере с тем же табельным номером абсолютно
ясно, что он должен оставаться уникальным на протяжении всей
жизни базы и появление искусственного ключа мало того, что
нарушает правило нормализации, так еще и противоречит
фундаментальному философскому принципу Оккама - "сущности не
следует умножать без необходимости" ("Entities should not be
multiplied unnecessarily", William of Ockham). Я уж не говорю,
что в справочниках, как правило, тоже есть естественные
натуральные ключи, а их значения вставляются практически во все
таблицы. В таких случаях кажется неестественным организовывать
сложнейшие соединения таблиц по 10-20. Кроме того, чем больше
синтетических ключей в таблице, тем меньше она несет информации
сама по себе и тем больше чувствительна к потерям и ошибкам в
связанных таблицах.
Я постарался объяснить, почему ответ - "используй синтетические
ключи там, где нельзя использовать естественные", не кажется мне
разумным. Т.е. это тот случай, когда желательно все же не
действовать по принципу "и ты прав и ты тоже прав". Sergey
Всего в теме 290 сообщений
Добавить свое сообщение
Отслеживать это обсуждение
№ 210 30-09-2009 06:01 | |
Ответ на »сообщение 209« (Geo)
___________________________
>>> каждой квартире нужно поставить в соответствие некоторое абстрактное уникальное число,
>>> и в запись для человека прописывать это самое число, а не номер квартиры.
Правильно.
И если появляется неучтённая квартира, то операции с ней можно делать
только после того, как ей будет присвоено "абстрактное уникальное число".
№ 209 30-09-2009 05:09 | |
Ответ на »сообщение 207« (Как слышно? Приём!)
___________________________
>>> Если же база данных должна общаться с внешним миром, то либо подавай естественные ключи с правилами их формирования, либо налаживай сервис присвоения искусственных ключей.
Вот и стала ясна причина спора ;-)
Давайте все же определимся, что именно мы понимаем под ключом. Вообще-то базданщики первичными и внешними ключами (primary key, foreign key) понимают способ реализации отношений на таблицах за счет механизмов СУБД. К пользовательскому интерфейсу это не имеет никакого отношения. Пусть у нас БД, учитывающая, в частности, квартиры многоквартирного дома, и людей, которые в этих квартирах живут. Имеется таблица людей (с их атрибутами) и таблица квартир (с их атрибутами). Для реализации отношения "Человек проживает в такой-то квартире" сторонники естественных ключей считают, что надо в записи для человека ввести поле, в котором прописывать номер квартиры. А сторонники искусственных ключей считают, что каждой квартире нужно поставить в соответствие некоторое абстрактное уникальное число, и в запись для человека прописывать это самое число, а не номер квартиры.
А что там будет отображаться в окошечках, когджа пользователь будет кнопки нажимать, это уже другой вопрос. Он тоже важен, но выходит за рамки данного спора.
№ 208 30-09-2009 04:59 | |
Ответ на »сообщение 207« (Как слышно? Приём!)
___________________________
Если же база данных должна общаться с внешним миром, то либо подавай естественные ключи
с правилами их формирования Это устоявшееся заблуждение. Результат: всякие там ОКОНХ, ОКПО, ИНН, и прочие числа зверя. По сути это пережитки тех времен, когда в каждом уездном городке изобретали свою систему учета. Достаточно было бы для всех объектов учета иметь только один идентификатор, тогда даже бумажные квитанции заполнять было бы гораздо проще. Тем более, что так или иначе для регистрации любого ларька требуется отправить данные в какие-то центральные БД, нет ни каких проблем получить значение нового идентификатора исключив вероятность повторения.
№ 207 30-09-2009 04:06 | |
Скажу по другому.
Если Вы хотите со своей БД вариться в собственном соку - то извольте пройти к искусственным ключам.
Это случай подавляющего большинства программных систем для внутреннего потребления.
Если же база данных должна общаться с внешним миром, то либо подавай естественные ключи
с правилами их формирования, либо налаживай сервис присвоения искусственных ключей.
№ 206 30-09-2009 04:01 | |
Ответ на »сообщение 205« (Geo)
___________________________
Вот Ваши слова
>>> искуссвтенные первичные ключи предназначены только для того, чтобы обеспечивать целостность данных внутри системы, не вылезая наружу.
Вот мои
>>> Но если БД эксплуатируется с выходом и входом в реальную жизнь, например, на бумажные носители,
>>> то некий сервис обработки и поддержания естественных ключей неизбежен.
Не видно корреляции?
№ 205 30-09-2009 03:14 | |
Ответ на »сообщение 201« (Как слышно? Приём!)
___________________________
>>> Как тебе песенка 38652004?
>>> Не-а, мне больше 79223133 по душе :)
...
>>> Тут придумывают ИНН с процедурами регистрации - сервис поддержки суррогатных ключей
У меня складывается впечатление, что Вы не совсем себе понимаете, что такое искусственные ключи и зачем они нужны. Но сначала (как водится) аналогия
-- А как мне в Вашей программе ввести ФИО пользователя?
-- Откройте форму TForm1 ;-)
Почему-то при программировании на Delphi Вы не выступаете против того, что программисты используют для технических целей служебные переменные, которые пользователю не видны. Так и в базах данных: искусственный первитчный ключ -- это поле, которое пользователю не видно. Ползователь вообще не знает, что есть такое поле. Вместо этого для он пользуется другим полем, выполняющим функцию пользовательского идентификатора. А искуссвтенные первичные ключи предназначены только для того, чтобы обеспечивать целостность данных внутри системы, не вылезая наружу.
Если программист разработал БД, в которой для идентификации песен пользователем использует значение искусственного первичного ключа, то это беда программиста, а не искусственных ключей.
№ 204 30-09-2009 02:46 | |
Ответ на »сообщение 202« (Cepгей Poщин)
___________________________
>>> Речь о случаях когда например по табельному номеру выстраиваются связи главный подчиненный.
Это да.
Но если база живая то табельный номер для налоговой, скажем, или страховой компании,
которые собирают данные с нескольких предприятий не проходит.
Тут придумывают ИНН с процедурами регистрации - сервис поддержки суррогатных ключей.
№ 203 30-09-2009 02:41 | |
Ответ на »сообщение 202« (Cepгей Poщин)
___________________________
>>> по табельному номеру выстраиваются связи главный подчиненный
Не люблю быть ни главным, ни подчинённым.
Поэтому я табельные номера и не перевариваю :)
>>> Да, не люблю [философию].
Вот в этом углу философия, а в том - эклектика и софистика.
№ 202 30-09-2009 01:47 | |
Ответ на »сообщение 201« (Как слышно? Приём!)
___________________________
Как тебе песенка 38652004? По моему это несколько не то. Речь о случаях когда например по табельному номеру выстраиваются связи главный подчиненный.
Не любите Вы философию :) Да, не люблю. Потомучто под любую ситуацию можно найти соответствующее изречение и в результате тот, кто лучше владеет искусством софистики и эклектики, оказывается прав, только какое это имеет отношение к практической целесообразности.
№ 201 30-09-2009 00:08 | |
Ответ на »сообщение 200« (Geo)
___________________________
>>> в голову никому не придет использовать естественные ключи
Мне в голову пришло, что суррогатные ключи - это когда БД нужна в основном разработчику.
Проектные работы, например, бухгалтерия с табельным номером.
Но если БД эксплуатируется с выходом и входом в реальную жизнь, например, на бумажные носители,
то некий сервис обработки и поддержания естественных ключей неизбежен.
Представляю, скажем, обсуждение музыкальных записей.
Как тебе песенка 38652004?
Не-а, мне больше 79223133 по душе :)
>>> Для создания идентификаторов все пользуются стандартными средствами безо всякой философии.
Не любите Вы философию :)
А, по моему, при росте скорострельности техники на четыре-пять порядков
использовать прежние подходы неестественно по философским основаниям.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|
|