Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
 Суррогатные или естественные  [new]
mummonth
Member

Откуда:
Сообщений: 19
Привет страна!
Мы начинаем строить структуру БД (да, все когдато бывает в первый раз) и начальник хочет использовать естественные первичные ключи. По данному адресу в принципе этот вопрос не плохо рассмотрен.
Но меня все равно терзают смутные сомнения - что лучче использовать в качестве первичого ключа. Мож кто поделится опытом - чоб потом не обламываться.
10 окт 02, 11:44    [62756]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
Александр Степанов
Member

Откуда: Санкт-Петербург
Сообщений: 450
Вот еще можно посмотреть:

Проблема выбора первичных ключей в разработке приложений баз данных
Естественные ключи против искусственных ключей
10 окт 02, 12:00    [62763]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
Yossarian
Guest
Уважаемый mummonth !

Мы всячески приветствуем Ваше начинание,
но тем не менее, я должен сообщить Вам,
что решить этот вопрос априори не представляется
возможным.

В одних задачах лучше суррогатные ключи, в других
естественные. В третьих (!) имеет смысл изменение
структуры бизнеса с целью объединения тех и других
( к примеру, введение практики присваивания
идентификационного номера покупателю ).

Иногда архитектура приложения требует наличия
у некоторых сущностей суррогатных ключей, даже
если их наличие противоречит здравому смыслу.

Все очень сильно зависит от конкретной задачи.
10 окт 02, 12:14    [62777]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
akuz
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 6749
Дело в том, что естественные ключи, обычно состоят из более чем одного поля.
Попробуйте написать процедуру обновления записи в таблице с таким ключём.
И посмотрите на список необходимых параметров при каждом из подходов.
Или например создайте две таблицы со связями типа поле в таблице1 - значение из таблицы2.
И вы сразу поймёте нужен ли вам суррогатный ключ.
Второй момент, что будет, если принципы формирования естественного ключа меняются? Например раньше он был числом, а теперь ваш начальник решил, что он будет строкой.
Третий момент, а насколько эффективно у вас будет работать индекс по первичному ключу типа varchar(500)?
И т.д. и т.п.
Это аргументы против естественных первичных ключей.

Против суррогатных первичных ключей аргументов не знаю.
Поэтому использую всегда в качестве ключа поле id int IDENTITY(1,1) PRIMARY KEY. Универсальнее не бывает! А уникальность естественного ключа можно реализовать через индексы. К тому же всегда можно его сделать кластерным.

А какие аргументы, кроме "я так хочу", приводит ваш начальник. Если никаких, то не терзайтесь, всё равно будет так, как он хочет. Вам ведь, если я не ошибаюсь, деньги не за результат платят, а за время, так вот с естественными ключами вы будете больше париться, соответственно больше заработаете.
А обламываться, при наличии начальника, всё равно придётся (из опыта). Но вы не расстаивайтесь, главное поменьше творчества и побольше формализма!
10 окт 02, 13:25    [62838]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
Glory
Member

Откуда:
Сообщений: 104764
Согласен с akuz.
Первичный ключ пытаюсь всегда сделать суррогатным.
А если приходится использовать естественный ключ, то добавляю его в качестве альтернативного уникального ключа.
10 окт 02, 13:54    [62855]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
Yossarian
Guest
> Против суррогатных первичных ключей аргументов не знаю
Это очень плохо. Врага надо знать в лицо.

1) Проблема идентификации.
Суррогатный первичный ключ не несет никакой информации
о сущности, соответствующей данной записи в базе.
Таким образом, иногда необходимо предпринимать дополнительные усилия для обеспечения уникальности
бизнес-сущностей. Например, вводить UNIQUE индекс.
2) Проблема слияния
Если нужно объединять данные из разных баз,
возникает сразу два вопроса - разрешение конфликтов
ключей, если две разных сущности имеют одинаковые
суррогатные ключи в разных базах, и отождествление
записей, относящихся к одной и той же сущности,
но имеющих разные ключи.
3) Проблема ключа в прикладной программе.
Допустим, есть некий справочник состояний :
1 - получено
2 - положено
3 - отгружено
1,2,3 - значения суррогатного ключа. Как программисту
приложения записывать значения, если делать это надо
не из интерфейсной части ?
Зашить соответствие кодов смыслу ? Но тогда при
изменениях в справочнике IDENTITY может 'уйти'.
Разработчику БД придется принимать меры против этого.
Или выбирать значение ключа, соответствующее
данному слову ?
select id from tabl where code='отгружено'
Так будет медленнее и кроме того, если кто-то
изменит справочник, то все перестанет работать.
10 окт 02, 14:09    [62868]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
Jimmy
Member

Откуда: г.Москва
Сообщений: 3137
1) Проблема идентификации.
Суррогатный первичный ключ не несет никакой информации

И правильно, что не несет. Первичный ключ (суррогатный) обеспечивает только DRI, поэтому его задача уникально идентифицировать запись, а не нести смысловую нагрузку.

2) Проблема слияния
Если нужно объединять данные из разных баз,
возникает сразу два вопроса - разрешение конфликтов
ключей, если две разных сущности имеют одинаковые
суррогатные ключи в разных базах, и отождествление
записей, относящихся к одной и той же сущности,
но имеющих разные ключи.


См. UNIQUEIDENTIFIER

3) Проблема ключа в прикладной программе.
Допустим, есть некий справочник состояний :
1 - получено
2 - положено
3 - отгружено
1,2,3 - значения суррогатного ключа. Как программисту
приложения записывать значения, если делать это надо
не из интерфейсной части ?


Не понял, сорри

Зашить соответствие кодов смыслу ? Но тогда при
изменениях в справочнике IDENTITY может 'уйти'.
Разработчику БД придется принимать меры против этого.
Или выбирать значение ключа, соответствующее
данному слову ?
select id from tabl where code='отгружено'
Так будет медленнее и кроме того, если кто-то
изменит справочник, то все перестанет работать.


Нужно необходимые записи вставлять при генерации схемы (БД) и считать их системными.
Т.е. в справочник добавить поле IsSystem - BIT(1), поднять единицу для системных записей, а в триггерах проверять, если производится попытка изменить/удалить запись с признаком IsSystem = 1 и пользователь не принадлежит группе sa или dbo, то отвергать эти попытки.
Ну и само поле защитить аналогично.
10 окт 02, 14:39    [62889]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
ziktuw
Member

Откуда:
Сообщений: 3553
1) Проблема идентификации.
Суррогатный первичный ключ не несет никакой информации
о сущности, соответствующей данной записи в базе.


В определение первичного ключа не входит задача определять сущности. У него задача идентифицировать записи.

Таким образом, иногда необходимо предпринимать дополнительные усилия для обеспечения уникальности бизнес-сущностей. Например, вводить UNIQUE индекс.

Все ограничения, задаваемые предметной областью, должны быть обеспечены в БД. Если есть требование уникальности, то конечно UNIQUE. К ключам это отношения не имеет.

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


Суррогатный ключ имеет сугубо внутреннее предназначение. Поэтому для внешних идентификаций он не совсем подходит. Зато для внешних идентификаций вполне пригоден естественный ключ. Что не уменьшает полезность суррогатного ключа для внутренних идентификаций.

3) Проблема ключа в прикладной программе.
Допустим, есть некий справочник состояний :
1 - получено
2 - положено
3 - отгружено
1,2,3 - значения суррогатного ключа. Как программисту
приложения записывать значения, если делать это надо
не из интерфейсной части ?


Тоже самое, что и в предущем случае. Для внешних идентификаций удобно применять естественный ключ.
10 окт 02, 15:26    [62916]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
Yossarian
Guest
Я наверное невнятно выразился :-)

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

Это немного не так :-)

При натуральных ключах - одни проблемы, при суррогатных
другие. И все эти проблемы так или иначе решаются. Но
неправильно говорить, что этих проблем НЕТ.

Вот и все... Добавлю только

>В определение первичного ключа не входит задача определять сущности. У него задача идентифицировать записи

Это, конечно, так... но... записям в таблице все же
соответствуют некоторые сущности, и с этим
приходится считаться. И именно в процессе нахождения
соответствия и возникают сложности.
10 окт 02, 15:40    [62923]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
dkstranger
Member

Откуда: Москва
Сообщений: 341
2Yossarian
По-видимому, Вам очень близки наши проблемы -
видно практика :)..
Целиком и полностью согласен...
От себя добавлю проблему типизации ключей..
В случае Identity(1,1) разные таблицы
могут иметь совпадающие ключи, что потенциально
дает возможность связок, не имеющих предметного
смысла (мухи=котлетам)..
Не сильно помогает шаг, например, через 10 ....

И еще - при наличии своей процедуры генерации ключа
можно делать еще кучу всего /например, записывать логи, что не всегда удобно через тригера и т.п./
10 окт 02, 15:49    [62927]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
Genady
Member

Откуда: Москва
Сообщений: 2005
В случае Identity(1,1) разные таблицы
могут иметь совпадающие ключи, что потенциально
дает возможность связок, не имеющих предметного
смысла (мухи=котлетам)..


Как это?
10 окт 02, 16:05    [62936]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
dkstranger
Member

Откуда: Москва
Сообщений: 341
2Genady
Create table Мухи(
id int identity (1,1),
...)

Create table Котлеты(
id int identity (1,1),
...)

select * from Мухи,Котлеты where Мухи.id=Котлеты.id
10 окт 02, 16:08    [62939]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
sergwsk
Member

Откуда: М
Сообщений: 558
To dkstranger:
С другой стороны - как бороться тогда с омонимами ?
10 окт 02, 16:22    [62948]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
dkstranger
Member

Откуда: Москва
Сообщений: 341
2sergwsk
Типизация - вообще, штука особая ...
Мы ей сами не всегда пользуемся /нет универсальных рецептов/
Однако, грамотная типизация позволяет обойти кучу таких проблем /ну, не может быть муха равна котлете физически:)/
10 окт 02, 16:25    [62951]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
RedPank
Member

Откуда:
Сообщений: 269
Полностью согласен с akuz и Glory.
Для связи между талицами использую СК, а для ускорения поисков (если такое необходимо) ЕК.
10 окт 02, 16:28    [62957]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
Yossarian
Guest
Я немного пишу на эту тему статью. :-))
Коротко не получится, но в целом мне кажется,
что если на основании теоретико-множественного
подхода расклассифицировать таблицы, то многие
проблемы с суррогатными ключами можно будет
решать не задумываясь. То есть автомагически,
на основании метаданных низкого уровня.
Кстати, проблемы связи мух с котлетами решаются
именно использованием метаданных. То есть в
метаданных указываем, кого с кем можно, а кого
нельзя.
Наличие, к примеру, Foreign key, вовсе не означает,
что проджойнив таблицы, мы получим осмысленный
результат...
10 окт 02, 16:33    [62964]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
sergwsk
Member

Откуда: М
Сообщений: 558
To dkstranger:
Про омонимы не ответили :-).
А есть ли содержание в цифре?
10 окт 02, 16:37    [62967]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
dkstranger
Member

Откуда: Москва
Сообщений: 341
2Yossarian
Очень хотелось бы пообщаться ..
/лет 5 назад в курсе реляционных БД для
аспирантов у меня было две лекции на тему семантики ключей/
10 окт 02, 16:38    [62968]     Ответить | Цитировать Сообщить модератору
 Про омонимы  [new]
dkstranger
Member

Откуда: Москва
Сообщений: 341
2serwsk
Уточните, пожалуйста ..
Я не понял проблемы с омонимами - по-моему, их просто в идеале не должно быть :)
10 окт 02, 16:40    [62972]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
Genady
Member

Откуда: Москва
Сообщений: 2005
select * from Мухи,Котлеты where Мухи.id=Котлеты.id

Но тогда таким образом можно любую таблицу соединить с любой другой и по любым полям и вполне возможны совпадения, а смысл?
10 окт 02, 16:40    [62973]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
dkstranger
Member

Откуда: Москва
Сообщений: 341
2Gennady
Смысла в соединении разных по сути бизнес-объектов нет:)
Именно поэтому и вознивает инструментарий - типизация ключей
10 окт 02, 16:42    [62975]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
Yossarian
Guest
2dkstranger

>Очень хотелось бы пообщаться ..
нет проблем.

nickol(at)argussoft.ru
10 окт 02, 16:42    [62976]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
sergwsk
Member

Откуда: М
Сообщений: 558
to dkstranger: Мух нельзя сравнивать с котлетами,
но и :
супружеские отношения не всегда испорченные :-))

Брак <> Брак
10 окт 02, 16:43    [62977]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
Genady
Member

Откуда: Москва
Сообщений: 2005
лет 5 назад в курсе реляционных БД для
аспирантов у меня было две лекции на тему семантики ключей


Опубликовать на sql.ru можете?

Именно поэтому и вознивает инструментарий - типизация ключей

Немного поподробней можно?
10 окт 02, 16:50    [62983]     Ответить | Цитировать Сообщить модератору
 Re: Суррогатные или естественные  [new]
dkstranger
Member

Откуда: Москва
Сообщений: 341
2Genady
К сожалению, с того времени многое потеряно -
сохранились только некоторые черновики ...
Я только что отправил письмо Yossarian-у.
Попросите, может, он направит копию вам.
А попытка обсуждать подобные проблемы в этом форуме уже пару раз приводила к базару :)
10 окт 02, 17:10    [62989]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить