Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.31;
Скачать: CL | DM;

Вниз

Master-Detail связь: программно или при проектировании?   Найти похожие ветки 

 
ZiTrAX   (2006-10-15 21:16) [0]

Обязательно ли при проектировании БД использовать ограничения ссылочной целостности, master-detail связь? Просто мне удобнее наделать кучу отдельных таблиц, а все связи между ними поддерживать при программировании на Delphi (т.е., если в каком-то поле нужен выбор из другой таблицы, то мне это проще сделать программно). Влияет ли это как-то на скорость работы или на что-то ещё? Или, может, то, что мне удобно, считается дурным стилем или привычкой?


 
Zacho ©   (2006-10-15 21:42) [1]

То, что тебе удобно, рано или поздно приводит к нарушению ссылочной целостности (Referential Integrity, RI).
Единственный способ гарантированного соблюдения RI - внешние ключи (Foreign Keys, FK)

В некоторых (довольно редких) случаях ради производительности можно пожертвовать FK, но тогда необходимо принимать дополнительные меры для контроля, и в случае нарушения - для восстановления RI.

А вообще для понимания того, что такое RI и зачем она нужна очень рекомендую почитать что-нибудь по теории РСУБД, например К.Дж.Дейт "Введение в системы баз данных"


 
Desdechado ©   (2006-10-15 23:01) [2]

при создании внешних ключей обычно автоматом создаются индексыпо этим полям, чтоочень положительно сказывается на скорости доступа к данным


 
Deniz ©   (2006-10-16 07:09) [3]


> Desdechado ©   (15.10.06 23:01) [2]
>
> при создании внешних ключей обычно автоматом создаются индексыпо этим полям, чтоочень положительно сказывается на скорости доступа к данным

Иногда индексы по FK мешают.

> ZiTrAX   (15.10.06 21:16)
Никто не мешает "...все связи между ними поддерживать при программировании на Delphi " при наличие ссылочной целостности, просто в некотрых случаях очень помогает напримет cascade delete.


 
ANB ©   (2006-10-16 11:47) [4]


> при создании внешних ключей обычно автоматом создаются индексыпо
> этим полям

не всегда. во всяком случае, в оракле при create constraint индексы автоматом не создаются.


> Иногда индексы по FK мешают.

Это когда ?


 
Zacho ©   (2006-10-16 12:01) [5]

ANB ©   (16.10.06 11:47) [4]
Это когда ?


В IB/FB иногда любой индекс может помешать. Оптимизатор может "подцепить" индекс, даже в том случае, если его использование приведёт к более медленному выполнению запроса. Правда, бороться с этим не сложно, да и оптимизатор с каждой версией становится всё совершеннее.


 
Sergey13 ©   (2006-10-16 12:08) [6]

> Это когда ?

ИМХО, когда ссылка идет на маленький и стабильный справочник, типа "единиц измерения" или "валюта платежа"


 
ANB ©   (2006-10-16 12:22) [7]


> ИМХО, когда ссылка идет на маленький и стабильный справочник,
>  типа "единиц измерения" или "валюта платежа"

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


 
Desdechado ©   (2006-10-16 12:50) [8]

ANB ©   (16.10.06 11:47) [4]
> не всегда
Я написал обычно.

> в оракле при create constraint индексы автоматом не создаются
У автора FireBird. Там - создаются.

Deniz ©   (16.10.06 07:09) [3]
> Иногда индексы по FK мешают.
Знаю только один случай, когда они не то, чтобы мешают, а только поедают дополнительное место. Это случай, когда поле по FK входит частично или полностью в первичный или уникальный ключ. Тогда индекс по FK не нужен, т.к. работает индекс другого ключа. Но это меня не напрягает.
А ты какие "мешалки" знаешь?

> Никто не мешает "...все связи между ними поддерживать при
> программировании на Delphi " при наличие ссылочной целостности
Глупости это. При доступе в БД минуя твою программу в БД образуется невыразимый бардак, который разгрести просто невозможно. И, поверь, если есть возможность такого доступа, ею воспользуются. Такова жизнь.

> просто в некотрых случаях очень помогает напримет cascade delete.
Весьма редко нужное свойство.


 
Sergey13 ©   (2006-10-16 13:38) [9]

> [7] ANB ©   (16.10.06 12:22)

Ты часто удаляешь записи из подобных справочников? Зачем? Обычная судьба подобных таблиц - просто быть однажды заполненными (при создании) с редкими  (очень) пополнениями.
Индекс, же постороенный по такому полю, тем же ораклом никогда не подхватится, если ты ему этого специально не прикажешь хинтом (что будет большой ошибкой в данном случае).


 
ANB ©   (2006-10-16 14:11) [10]


> тем же ораклом никогда не подхватится

Эт смотря какой запрос. И входит ли этот ID в какой нибудь полезный составной индекс.


 
Sergey13 ©   (2006-10-16 14:16) [11]

> [10] ANB ©   (16.10.06 14:11)

Если он входит в какой то составной индекс, то это как-то не совсем подходит под индекс для констрейнта, согласись.
Т.е. не то что бы совсем никак, но и как обычно. 8-)


 
ANB ©   (2006-10-16 14:46) [12]


>
> Sergey13 ©   (16.10.06 14:16) [11]

Да я индексы по жизни руками создаю. Клипперовая привычка. И как правило делаю их составными.


 
Sergey13 ©   (2006-10-16 15:20) [13]

> И как правило делаю их составными.

По какому принципу?


 
ANB ©   (2006-10-16 15:27) [14]


> Sergey13 ©   (16.10.06 15:20) [13]
> > И как правило делаю их составными.
>
> По какому принципу?

Да как больше понравится. :)
Ладно, завязываем.


 
Deniz ©   (2006-10-17 09:13) [15]

> Desdechado ©   (16.10.06 12:50) [8]
> А ты какие "мешалки" знаешь?

В принципе уже ответили, но чуть добавлю.
При изменении(insert, update, delete) таблицы, делается update индекса - доп. операция.

> Глупости это. При доступе в БД минуя твою программу
Имелось ввиду, что ограничения ссылочной целостности не мешают программированию в Delphi, и там можно реализовывать что хочешь.
Или я не так сказал, или ты не так понял, или одно из пяти ;-)
> Весьма редко нужное свойство.
Я же написал "... некотрых случаях ...".

PS:Ладно завязываем. Тем более автора не видать.


 
Desdechado ©   (2006-10-17 10:38) [16]

> делается update индекса - доп. операция
index overhead - не самое страшное в жизни базы


 
Сало   (2006-10-17 16:47) [17]

Радует, что в 2.1 или 3.0 можно будет не создавать индексы по внешним ключам.


 
Sergey13 ©   (2006-10-17 17:01) [18]

> [17] Сало   (17.10.06 16:47)

Это так давит на тебя? 8-)
Эти индексы не всегда приносят ощутимую пользу (достаточно редко, надо заметить), но зато и никогда не наносят ощутимого вреда.


 
Desdechado ©   (2006-10-17 17:49) [19]

Вот-вот. Зато недостаток индексов по внешним ключам может весело приводить к блокировке целой подчиненной таблицыв случае изменения/удаления записей из главной. А это прямой путь к дэдлокам.


 
ZiTrAX   (2006-10-17 20:07) [20]

Спасибо всем, кто откликнулся. Начал переделывать БД, используя ограничения ссылочной целостности, но дело продвигается туговато:-((


 
Desdechado ©   (2006-10-17 20:50) [21]

Фразу Зато недостаток индексов по внешним ключам может читать как Зато отсутствие индексов по внешним ключам может

ZiTrAX   (17.10.06 20:07) [20]
> дело продвигается туговато
Ничего. Тяжело в начале, потом зато на автопилоте будешь делать. Заодно, похоже, и структуру к 3-й нормальной форме привести можно.


 
Petr V.Abramov   (2006-10-17 21:10) [22]

> Зато недостаток индексов по внешним ключам может весело приводить к
> блокировке целой подчиненной таблицыв случае изменения/удаления
> записей из главной.
 ну тут уж надо выбрать, рыбку или на елку. учитывая, что удаление, вообще говоря, гораздо более редкая операция, чем вставка/обновление, лучше рыбку :)

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


 
ZiTrAX   (2006-10-17 21:30) [23]

Такой вопрос: обязательно ли в таблицах использовать автоинкрементные поля - "идентификаторы" вида *_id, которые однозначно идентифицируют запись? А если первичным ключом сделать VARCHAR размером 60, повлияет ли это как-то на производительность?


 
saxon   (2006-10-17 21:39) [24]


> обязательно ли в таблицах использовать автоинкрементные
> поля - "идентификаторы" вида *_id, которые однозначно идентифицируют запись?

Нет, не обязательно.


> А если первичным ключом сделать VARCHAR размером 60, повлияет
> ли это как-то на производительность?

На производительность не повлияет, по крайней мере - ощутимо.
Все зависит, естественно, от задачи, однако, в большинстве случаев так делать не стоит. Лучьше по первому варианту.


 
Zacho ©   (2006-10-17 21:46) [25]

ZiTrAX   (17.10.06 21:30) [23]
обязательно ли в таблицах использовать автоинкрементные поля


Прочитай http://www.ibase.ru/devinfo/NaturalKeysVersusAtrificialKeysByTentser.html


 
Petr V.Abramov   (2006-10-17 22:08) [26]

> ZiTrAX   (17.10.06 21:30) [23]
вот этот вопрос, хоть и серьезный технический,  в потрепаловке обычно висит подолгу
P.S. а мое мнение - формально необязательно, но так же необязательно, как чистить зубы :)


 
ZiTrAX   (2006-10-17 22:10) [27]

Спасибо за ссылку! Следующая фраза очень поучительна
> ...закладывать в систему тезис о неизменности ЕК - закладывать
> под себя мину...



Страницы: 1 вся ветка

Текущий архив: 2006.12.31;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.063 c
15-1165835938
Petr V. abramov (not at home)
2006-12-11 14:18
2006.12.31
Помогите с трудоустройством красивой женщины


8-1147253674
BOGDAN
2006-05-10 13:34
2006.12.31
Эффект воды на битмапе


15-1165610085
tesseract
2006-12-08 23:34
2006.12.31
pocket PC


15-1165953241
Kolan
2006-12-12 22:54
2006.12.31
Временно обзавелся 2м монитором.


2-1166023874
azl
2006-12-13 18:31
2006.12.31
ArcCos x(квадрат)