Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Primary Key и Unique key


Страницы:   1 2 3 4

Piter ©   (2005-10-04 22:19:00) 

Объясните, пожалуйста, человеческим языком - зачем нужен Primary Key?

Большинство отвечает - чтобы создать уникальное поле. Ок, а чем это тогда отличается от Unique key?
Большинство отвечает, что в Primary Key можно указывать несколько полей.

Это весь функционал этих директив?

А что физически в базе происходит при этом? Так ли важно задавать первичный ключ? Если первичный ключ - одно поле, то можно легко заменить на Unique key?

А если у меня все поля могут быть одинаковые - то Primaty Key не нужен?

А если уникальность нужна только для всех полей - допустим указывать в Primary Key все поля базы? Имеет ли это смысл?

Запутался чего-то я...


Fay   (2005-10-06 15:10:00) [21]

2 Sergey_Masloff   (06.10.05 13:37) [48]
>select rowid from ANYTABLE  -- ORACLE
> select rdb$db_key from ANYTABLE  -- InterBase

Некий смысл имеет только rowid в Oracle.
Говорить rdb$db_key (и т.п.) так же занимательно, как утверждать, что PK - это индекс.


Sergey_Masloff   (2005-10-06 14:13:00) [22]

msguns ©   (06.10.05 13:44) [49]
Да, похоже я высказался туманно ;-) Нет этодополнительное
Может это сбило ;-) Я просто хотел сказать что поле с системными адресами записей есть в любом случае. Но они НЕ праймари кей и никоем образом не оправдывает его отсутствие. И никаких его функций не выполняет.
 Надеюсь никто не понял меня так что раз dbkey есть то праймари не нужен? Такого я не мог не то что сказать - даже в бреду подумать ;-)))


msguns   (2005-10-06 13:44:00) [23]

>Sergey_Masloff   (06.10.05 13:37) [48]
>select rowid from ANYTABLE  -- ORACLE
>select rdb$db_key from ANYTABLE  -- InterBase

И как это соотноситься с [8], а именно

Нет это дополнительное поле представляющее адрес записи будет создано в любом случае- задавай ты праймари кей или не задавай.

???

Сереж, видимо, ты просто коряво выразил свою мысль,- вот у Фэя возникли непонятки. Как, впрочем и у меня, только я промолчал, прибитый авторитетом ;)))


Sergey_Masloff   (2005-10-06 13:37:00) [24]

Fay ©   (06.10.05 12:25) [44]
>Покажете как-нибудь?
select rowid from ANYTABLE  -- ORACLE
select rdb$db_key from ANYTABLE  -- InterBase


Desdechado   (2005-10-06 13:27:00) [25]

Курдль ©   (06.10.05 12:59) [46]
вот только "волшебные слова" никак не объясняют разницу между PK и UQ, а тем более этогоне сделают CASE-средства
концептуальную модель создает аналитик, а вот структуру БД создает проектировщик
так вот мы рассматриваем не поведение аналитика, а поведение проектирощика


Курдль   (2005-10-06 12:59:00) [26]

Ой, как интересно все! Скока слов написано!!!

Только мне кажется, что обучать автора топика стали не с той стороны (мягко говоря).

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

БД проектируются не от ключей, индексов, полей и правил.
Они проектируются от автоматизируемых бизнес-процессов и концепции хранения данных. Т.е. первым делом разрабатывается КОНЦЕПТУАЛЬНАЯ МОДЕЛЬ.
И нет в ней никаких ключей, индексов и даже таблиц.
Есть "сущности" или "элементы" (entity) и связи (relations). Поэтому она и называется еще "ER-модель".
Словестное описание таких моделей не содержит и упоминания о ключах и т.п.
Например: "В БД предусмотрена сущность ТОВАР (имя, срок годности), связанная, как "один-ко-многим" с сущностью СДЕЛКА(дата, цена). Последняя, в свою очередь, связана как "много-к-одному" с сущностью КОНТРАГЕНТ(имя, ИНН). И т.д.
Вот эти волшебные слова "связана", "много-к-одному" ... - и скрывают в себе необходимость иметь идентификаторы и внешние ключи.
А дальше уже можно ничего не знать о внутренней структуре БД и все равно успешно ее создать средствами CASE. А вот чтобы писать прикладные программы под такую БД ее структуру знать придется.


Fay   (2005-10-06 12:33:00) [27]

2 Piter ©   (05.10.05 18:58) [38]
Вы вАщЕ понимаете смысл слова constraint?

Как верно заметил msguns ([42]), у некоторых людей отлично получается делать мебель. И многие из них её действительно делают, не спрашивая "А почему нельзя гвоздями? Чем они хуже тех же шурупов и т.д.?". Таким замечательным мастерам я простил бы вопрос типа "зачем нужен Primary Key?"...


Fay   (2005-10-06 12:25:00) [28]

2 Sergey_Masloff   (04.10.05 23:09) [8]
> Нет это дополнительное поле представляющее адрес
> записи будет создано в любом случае - задавай ты
> праймари кей или не задавай.


Покажете как-нибудь?


Fay   (2005-10-06 12:23:00) [29]

2 Piter ©   (04.10.05 22:45) [2]
>> Ок, а чем это тогда отличается от Unique key?
Лучше+короче [1], наверноё, не скажешь.

2 Piter ©   (04.10.05 23:03) [6]
>> чисто из принципов построения СУБД наверное следует.
Вы уже большой мальчик. Пора бы знать точно.

>> если же это поле не будет задано - то база сама создаст дополнительное
>> поле и обеспечит его уникальность
Это вопрос, или бред?


msguns   (2005-10-06 09:29:00) [30]

>Piter ©   (05.10.05 18:15) [34]
>а если в логике приложения таблица только одна. PK не нужен?

В некоторых случаях, например, надо сделать простенький список и положить его в БД, он, вероятно, не нужен вовсе.
Но, понимаешь ли, существуют правила, каноны, стиль, если хочешь. Привив себе определенные привычки, просто научишься работать профессионально, правильно.

Просто пример для наглядности.
Мне как-то пришлось ремонтировать свое кресло, для чего я его разобрал. И ужаснулся, ибо все его деревянные части были сделаны из нестуганной сосны, даже грубым рубанком не прошлись, шаромыжники. Просто гвоздямигрубо сбит каркас из неструганных досок и брусов, а сверху обтянуто материей.
Этим летом ездил к маме в Волгоград и она меня попросила посмотреть покосившееся кресло из румынского гарнитура, купленного в начале 70-х.
Разобрал, глянул.. Все деревянные части сделаны из отполированныхбрусков хороших сортов дерева, без сучков и трещин. Крепеж исключительно на уголках и вкладышах болтами и винтиками, которые даже спустя 30 лет легко отвинтились. Поневоле отдал дань уважения Мастерам, сделавшим его.


ANB   (2005-10-06 09:24:00) [31]


> У меня вполне конкретный вопрос - если PK нужен чисто для
> целостности ссылок - то при наличии всего одной таблицы
> - он не нужен?

А у меня чисто конкретный ответ - если работаешь на оракле, то не очень (там еще есть rowid, но использование его не по теме не приветствуется), если на любой другой базу - то очень желателен, причем суррогатный на генераторе. Так как через него легче всего находить конкретную запись. SQL сервера - это не DBF и тут нельзя просто прогуляться по таблице и удалить конкретную запись. Плюс никто не может гарантировать, что в дальнейшем к этой таблице не будет связок. Я на такие грабли уже наступал - завел талицу, по логике ей было достаточно иметь составной ключ. Через неделю выяснилось, что на эту таблицу нужно сделать ссылку. А составная ссылка - жуткие грабли.


Desdechado   (2005-10-05 22:17:00) [32]

Anatoly Podgoretsky ©   (05.10.05 18:56) [37]
> Зачем?
Мне так нравится больше :)


sniknik   (2005-10-05 20:05:00) [33]

> если PK нужен чисто для целостности ссылок
но он нужен не только "чисто для целостности".

перечитай написанное, видать не проникся.


Piter   (2005-10-05 18:58:00) [34]

Anatoly Podgoretsky ©   (05.10.05 18:44) [35]

не проникся духом написанного? Это ответ программиста или священика?

У меня вполне конкретный вопрос - если PK нужен чисто для целостности ссылок - то при наличии всего одной таблицы - он не нужен?


Anatoly Podgoretsky   (2005-10-05 18:56:00) [35]

Desdechado ©   (05.10.05 18:47) [36]
Зачем, в данном случае это поле(я) кандидат на ПК


Desdechado   (2005-10-05 18:47:00) [36]

[34]
можно обойтись уником, если он не очень длинный и прироста таблиц не ожидается
но я бы все равно сделал суррогатный PK
по нему потом легче позиционироваться при UPDATE|DELETE|SELECT - быстрее на сервере и в коде понятнее


Anatoly Podgoretsky   (2005-10-05 18:44:00) [37]

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


Piter   (2005-10-05 18:15:00) [38]

msguns ©   (05.10.05 9:55) [18]
Основное семантичесое (смысловое) назначение PK - поддержка межтабличных связей


а если в логике приложения таблица только одна. PK не нужен?


ANB   (2005-10-05 11:58:00) [39]


> Danilka ©   (05.10.05 11:28) [32]
- точно точно. Я сам задрался ругаться. В фоксе не всегда работает контроль на дубли, к тому же при приеме сведений от других источников этот контроль не ведется даже в новых системах. Куча дублей получается и при объединении районных налоговых.


Danilka   (2005-10-05 11:28:00) [40]

msguns ©   (05.10.05 10:08)
- суррогатный, т.е. реально не сущестующий, но необходимый для однозначной идентификации объекта хранения атрибут-поле. Как пример - ИНН (индивидуальный налоговый номер).


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


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо