Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Базарная площадь
  
О разделе

Основная страница

Группы обсуждений


Тематический каталог обсуждений

Архив

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  15:46[Войти] | [Зарегистрироваться]
Обсуждение темы:
Синтетические и естественные ключи.

Добрый день.

Может кто поможет мне определиться в том, какие ключи лучше использовать в качестве первичных - синтетические или естественные. Я прочитал несколько статей на эту тему, но не уверен, что пришел к определенным выводам. С одной стороны преимущество синтетического ключа кажется неоспоримым исходя из того постулата, что любой объект реального мира подвержен изменениям, иногда кардинальным. Очень многое из того, что кажется незыблемым, может меняться и довольно быстро. Трудно придумать действительно уникальный естественный ключ, например, возьмем таблицу рабочих предприятия. Что взять в качестве первичного ключа? Не буду говорить банальности о смене ФИО, пола, паспорта и т.п. Взять за основу псевдо естественное поле - табельный номер (ведь для того его и придумали)? А теперь представьте ситуацию - предприятие работает долго, имеет обширные архивы на CD-ROM, база эксплуатируется практически непрерывно (вполне реальные параметры для серьезных баз данных). Руководство отделов кадров решило, что теперь табельный номер должен быть не числовой, а текстовой и нести в себе некую доп. информацию (причем это с точки зрения программиста ситуация весьма нестандартная, а с точки зрения отдела кадров проста и менять свои взгляды на формат табельного номера оно может раз в неделю, кстати, на период становления нового стандарта так оно и будет). Что делать? Ну, в общем-то "что" понятно, но, боюсь, что будет плохо и базе и программисту.

С другой стороны в примере с тем же табельным номером абсолютно ясно, что он должен оставаться уникальным на протяжении всей жизни базы и появление искусственного ключа мало того, что нарушает правило нормализации, так еще и противоречит фундаментальному философскому принципу Оккама - "сущности не следует умножать без необходимости" ("Entities should not be multiplied unnecessarily", William of Ockham). Я уж не говорю, что в справочниках, как правило, тоже есть естественные натуральные ключи, а их значения вставляются практически во все таблицы. В таких случаях кажется неестественным организовывать сложнейшие соединения таблиц по 10-20. Кроме того, чем больше синтетических ключей в таблице, тем меньше она несет информации сама по себе и тем больше чувствительна к потерям и ошибкам в связанных таблицах.

Я постарался объяснить, почему ответ - "используй синтетические ключи там, где нельзя использовать естественные", не кажется мне разумным. Т.е. это тот случай, когда желательно все же не действовать по принципу "и ты прав и ты тоже прав".

Sergey

Количество сообщений на странице

Порядок сортировки сообщений
Новое сообщение вверху списка (сетевая хронология)
Первое сообщение вверху списка (обычная хронология)

Перейти на конкретную страницу по номеру


Всего в теме 290 сообщений

Добавить свое сообщение

Отслеживать это обсуждение
<<<... | 280—271 | 270—261 | 260—251 | ...>>>
Всего сообщений в теме: 290; страниц: 29; текущая страница: 3


№ 270   04-10-2009 09:02 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 269« (Geo)

Челябинские программеры настолько суровые, что кодят только в hex-редакторе.


___________________________
Поэтому никак не могу понять проблем. Проблемы в усложнении поддержки. В любой СУБД, названия таблиц, полей, типов и все связи и так присутствуют в системных таблицах, кроме того скрытно для пользователя выполняются некоторые проверки снижающие вероятность ошибки, по сути предлагается сделать то же самое, но самому. Есть так же различные инструменты упрощающие жизнь администратору/архитектору БД, их тоже на помойку. Во имя каких таких высоких целей требуется идти на такие жертвы?
 Cep


№ 269   04-10-2009 06:16 Ответить на это сообщение Ответить на это сообщение с цитированием
Господа, я, видимо, в выходные слишком торможу. Поэтому никак не могу понять проблем. Попробую на примере.

Пусть у нас есть справочник в таблице LIB. Поля ID и NAME. Есть диспетчерская таблица XATTR с полями ID, NAME (название доплнительного атрибута), ATYPE (тип значения дополнительного атрибута). И есть таблицы для значений каждого типа. Например, XATTR_INT_VAL, XATTR_STR_VAL и т.п. Структура примерно такая: ID, XATTR_ID (ссылка на запись в таблице XATTR), LIB_ID (ссылка на запись справочника, к которой относится данное значение), VAL (собственно значение; тип поля зависит от таблицы).

Естественно, не стоит заводить по одной таблице значений на кадый строковый тип (для VARCHAR(20) своя таблица, для VARCHAR(40) -- своя). Завести просто одну единственную для все строк с максимальной длиной текстовой строки.

Если нужно заводить дополнительные атрибуты для разных справочников, то тут теоретически возможны два варианта: либо привязку к таблице прописываем в XATTR (типа, дополлнитеьный атрибут всегда привязан к конкретной таблице), либо в таблицах XATTR_XXX_VAL (атрибут с одним и тем же названием может быть в разных таблицах, но в XATTR мы его прописываем один раз). В зависимости от БД и решаемых задач может оказаться выгодным как первый, так и второй способ.
 Geo


№ 268   04-10-2009 04:59 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 263« (Сергей Перовский)
___________________________
>>> Все необязательные атрибуты выносятся во вспомогательные таблицы
>>> и присутствуют не в виде колонки, а в виде строки, что не требует NULL-значений.

Вопрос правильно ли определены основные и необязательные.
Если база живая, то будет происходить переоценка.


№ 267   04-10-2009 04:55 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 265« (Geo)
___________________________
Будем последовательны.
К каждой (N) вторичной таблице приделаем еще М таблиц атрибутов :)


№ 266   04-10-2009 02:59 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 265« (Geo)
___________________________
А в чём достоинства такой схемы? Когда все атрибуты валятся в одну таблицу, это лёгкость введения нового типа атрибутов без внесения изменений в запросы, используемые программой. А тут, если новый тип, то новая таблица, значит, новый запрос, прграмму надо перекомпилировать. К тому же я вижу ещё несколько недостатков такой схемы:

1. Во всех атрибутивных таблицах будет поле "ссылка на атрибут", которое во всех строках будет иметь одинаковое значение. Раздувание объёма базы непонятно зачем.

2. Дублирование информации о типе атрибута: в диспетчерской таблице и в типе поля соответствующей дспетчерской таблицы.

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

Отсюда вопрос: а зачем всё это надо? Хорошо, избавились мы от NULL'ов, но получили кучу других проблем. Стоит ли оно того?


№ 265   04-10-2009 01:56 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 264« (Антон Григорьев)
___________________________
>>> Это что - для каждого возможного атрибута отдельная таблица? Вроде как жирно будет. Или там одна таблица, где есть поля "код атрибута" и "значение атрибута"?
Например, вот такой вариант. Есть таблица ("диспетчерская"), в которой определены все дополнительные атрибуты. В частности, наименование и тип. А есть по одной таблице на каждый тип данных из тех, что доступны в той самой диспетчерской таблице. В каждой из них имеется ссылка на определение атрибута в диспетчерской таблице, значение и ссылка на запись, к которой относится данное значение. Таким образом мы получим количество таблиц N+1, где N - кличество доступных типов для дополнительных атрибутов.

Это некая обобщенная принципиальная схема. Детализация зависит от структуры БД.
 Geo


№ 264   04-10-2009 00:20 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 263« (Сергей Перовский)
___________________________

Все необязательные атрибуты выносятся во вспомогательные таблицы и присутствуют не в виде колонки, а в виде строки, что не требует NULL-значений.

А можно с этого места поподробнее? Это что - для каждого возможного атрибута отдельная таблица? Вроде как жирно будет. Или там одна таблица, где есть поля "код атрибута" и "значение атрибута"? Это очень спорное решение, так как атрибуты могут быть разных типов, да и вообще оказаться ссылками на другие объекты, а механизмами СУБД целостность данных в этом случае поддержать невозможно. Придётся сложные триггеры писать.

Просто в проекте, в котором я сейчас участвую, используется БД именно с такой структурой, что доставляет целый ряд неудобств, так что это для меня больная тема.


№ 263   03-10-2009 14:39 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 262« (Денис Зайцев)
___________________________
СУБД, которые отказывают пользователям в праве использования NULL-значений
И это правильно (с) М.Горбачев
И, как ни странно, имеет непосредственное отношение к разговору.
Я не использую NULL в сколь-нибудь сложных проектах. По сути, главная таблица используется для связи синтетического ключа с составным естественным ключом, соответственно ключевые поля не могут быть не заполнены. Все необязательные атрибуты выносятся во вспомогательные таблицы и присутствуют не в виде колонки, а в виде строки, что не требует NULL-значений.


№ 262   03-10-2009 04:04 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 261« (Сергей Перовский)
___________________________

Что значит "строго реляционными"?

Видимо, имеются в виду Труъ реляционные СУБД, которые отказывают пользователям в праве использования NULL-значений, позволяют SELECT только как SELECT DISTINCT и т.п.


№ 261   02-10-2009 13:24 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 257« (Как слышно? Приём!)
___________________________
почему все(!) практические базы данных не удается сделать строго реляционными?
Что значит "строго реляционными"?
Весь SQL построен на манипуляции только таблицами.
Больше никаких сущностей там просто не существует.
Или Вы это про нормализацию?
Так это совсем другой разговор. Хорошо построенные базы нормализованы относительно любого возможного заполнения, а не относительно текущего состояния. Иначе их приходилось бы регулярно переструктурировать.


<<<... | 280—271 | 270—261 | 260—251 | ...>>>
Всего сообщений в теме: 290; страниц: 29; текущая страница: 3


Добавить свое сообщение

Отслеживать это обсуждение

Дополнительная навигация:
Количество сообщений на странице

Порядок сортировки сообщений
Новое сообщение вверху списка (сетевая хронология)
Первое сообщение вверху списка (обычная хронология)

Перейти на конкретную страницу по номеру
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования