Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.048 c
15-1165783578
Алхимик
2006-12-10 23:46
2006.12.31
Программирование - искусство, работа или подвиг?


9-1137539317
grouzd[E]v
2006-01-18 02:08
2006.12.31
Scroller Alive! Please test =)


2-1165995193
Neket
2006-12-13 10:33
2006.12.31
Запрос POST


15-1165407891
BiN
2006-12-06 15:24
2006.12.31
Новогодний маскарад IT-компаниях.


2-1165584300
TrainerOfDolphins
2006-12-08 16:25
2006.12.31
Вызвать обработчик, имя которого неизвестно в дизайн-тайме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский