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

Вниз

Поддержка ссылочной целосности   Найти похожие ветки 

 
Term   (2004-09-29 12:09) [0]

Как лучше сделать контроль ссылочной целостности
с помошью тригеров или
внешних ключей, почему спрашиваю тут мне сказали что задание RELATIONSHIPS типа не столь надёжно

вот и вкрались сомнения


 
Johnmen ©   (2004-09-29 12:12) [1]

>тут мне сказали

Аргументы были или просто трепались ?


 
Nikolay M. ©   (2004-09-29 12:16) [2]


> тут мне сказали что задание RELATIONSHIPS типа не столь
> надёжно

Бред какой-то.
Существует мнение, что поддержка триргерами более медленная (по идее так и есть, к сожалению, сам не проверял), но она же и более гибкая. Я лично генерю структуры базы CASE-ами, там все сводится к галочке, чем поддерживать целостность. Зато при необходимости можно дописать текст триггера на более сложную логику удаления + при желании вести логи событий.


 
АлексейК   (2004-09-29 12:33) [3]

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


 
Johnmen ©   (2004-09-29 12:35) [4]

>АлексейК   (29.09.04 12:33) [3]

А по твоему, как реализованы внешние ключи ?
И ты думаешь, они дополнительно не "нагружают" сервер ?


 
АлексейК   (2004-09-29 13:51) [5]

>Johnmen ©   (29.09.04 12:35) [4]
Значительно меньше.


 
Johnmen ©   (2004-09-29 14:09) [6]

>АлексейК   (29.09.04 13:51) [5]

Меньше. Но не значительно, это не разы и даже не десятки процентов...
:)


 
Sergey13 ©   (2004-09-29 14:13) [7]

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


 
sniknik ©   (2004-09-29 14:19) [8]

> потому что они не пишутся программистом.
;о)) а кем же они пишутся? наверное домохозяйками? ;о))

программистами они и пишутся, не прикладниками только, а теми кто ядро/обработку их писал.

p.s. не удержался ;), в принципе то ясно что хотел сказать.


 
АлексейК   (2004-09-29 14:21) [9]

Johnmen ©   (29.09.04 14:09) [6]
>АлексейК   (29.09.04 13:51) [5]

Меньше. Но не значительно, это не разы и даже не десятки процентов...
:)


Все таки заметно. И потом еще что в триггере напишешь, а то и десятки "разов" могут получится.


 
den_777   (2004-09-29 14:28) [10]


> Существует мнение, что поддержка триргерами более медленная
> (по идее так и есть, к сожалению, сам не проверял),

Проверял на СУБД INFORMIX, на большой базе при удалении большого числа записей.При времении удалении в 20 минут разница была в пару секунд, что наверняка можно списать на погрешность. Так что время должно быть одинаково так как в "нормальных" СУБД констрейнт это и есть системный триггер. Но как я уже писал у MSSQL совсем не похожая на другие СУБД реализация триггеров, так что для достоверности необходимо просто проэкспериментировать именно на MSSQL2000.


 
Johnmen ©   (2004-09-29 14:32) [11]

>АлексейК   (29.09.04 14:21) [9]

>Все таки заметно.

А я не замечаю - IB/FB. Но давно уверен, что у MSSQL много смешных проблем...:)


 
АлексейК   (2004-09-29 14:50) [12]

В IB реализация триггеров другая (и на мой взгляд более удачная, с точки зрения программирования). В MSSQL нет триггеров ни after ни before. Триггеры в MS SQL Server срабатывают после обновления и один раз на оператор (а не на каждую обновленную запись). В триггере доступна обновленная таблица и две виртуальных таблицы Inserted и Deleted. Так что для доступа к записи я должен обратится к Inserted или Deleted. Правда в MSSQL2000 появился INSTEAD OF. А вот работа внешних ключей оптимизирована очень неплохо.


 
KSergey ©   (2004-09-29 15:48) [13]

> А вот работа внешних ключей оптимизирована очень неплохо.

Применительно к MS SQL основная фраза. И пусть эти интербейзники не выпендриваются ;)) (шутка, если кто не понял)


 
Johnmen ©   (2004-09-29 15:53) [14]

>АлексейК   (29.09.04 14:50) [12]
>А вот работа внешних ключей оптимизирована очень неплохо.

А с чем ты сравниваешь ? Со смешными триггерами ? Так это сравнение некорректно, т.к. суть разные дела...

>KSergey ©   (29.09.04 15:48) [13]
>Применительно к MS SQL основная фраза.

А в чем оптимизация ?
Шутку поняли...:)


 
vuk ©   (2004-09-29 17:00) [15]

to Johnmen ©   (29.09.04 14:32) [11]:
>Но давно уверен, что у MSSQL много смешных проблем...:)
На чем уверенность основана, поконкретнее можно?


 
Johnmen ©   (2004-09-29 17:18) [16]

>vuk ©   (29.09.04 17:00) [15]

На личном опыте и опыте окружающих.


 
KSergey ©   (2004-09-29 17:36) [17]

> [14] Johnmen ©   (29.09.04 15:53)
> >KSergey ©   (29.09.04 15:48) [13]
> >Применительно к MS SQL основная фраза.
> А в чем оптимизация ?

Откуда мне знать? Но работает шустрее. Хотя, корректным и аккуратным тестированием не занимался.


 
vuk ©   (2004-09-29 17:45) [18]

to Johnmen ©   (29.09.04 17:18) [16]:
>На личном опыте и опыте окружающих.
А конкретики так и не будет? Интересно же...


 
Johnmen ©   (2004-09-29 17:46) [19]

>KSergey ©   (29.09.04 17:36) [17]
>Но работает шустрее.

Работает шустрее, чем что ?


 
Johnmen ©   (2004-09-29 17:47) [20]

>vuk ©   (29.09.04 17:45) [18]

Будет, если конкретно поставишь вопрос...:)


 
vuk ©   (2004-09-29 17:51) [21]

to Johnmen ©   (29.09.04 17:47) [20]:
>Будет, если конкретно поставишь вопрос...:)
Ставлю. Где конкретно у MSSQL смешные проблемы, упомянутые в [11]?


 
Nikolay M. ©   (2004-09-29 17:55) [22]


> Плюсы констрейнтов - они надежнее, потому что они не пишутся
> программистом.

Лично я за последние 4 года написал максимум десяток тригеров, отвечающих за поддержку СЦ, хотя все базы держались именно на тригерах. Получается, мои тригеры - надежные? :)


 
Johnmen ©   (2004-09-29 18:01) [23]

>vuk ©   (29.09.04 17:51) [21]

Одна из них описана в [12]. А нереализованность триггеров вообще до версии 7 вызывает как минимум недоумение. С улыбкой на лице у сдержанного человека и со смехом у несдержанного.

Ещё ?
:)


 
vuk ©   (2004-09-29 18:09) [24]

to Johnmen ©   (29.09.04 18:01) [23]:
>Одна из них описана в [12].
Это просто другой стиль работы с данными. Тому, кто работал только с IB это несколько непривычно, есть такое дело. Но, тем не менее, не вижу неразрешимых проблем при таком подходе к реализации триггеров. Или я не умею их (проблемы) готовить?

>А нереализованность триггеров вообще до версии 7 вызывает как
>минимум недоумение.
В свое время писал на 6.x. Триггеры там были.

>Ещё ?
Ага. :o)


 
Johnmen ©   (2004-09-29 18:27) [25]

>vuk ©   (29.09.04 18:09) [24]

1. Да дело-то не в этом. Дело в удобном и понятном разрешении проблем. И если в Оракле есть и такие и другие триггеры, то это понятно и осязаемо.

2.
>В свое время писал на 6.x. Триггеры там были.

Здесь, возможно, дело в x.
В своё время писал на 0. Триггеров не было.
Мои бывшие коллеги, писавшие на 5, тоже их не обнаружили...:)

3.
>Ага. :o)

Нереализованность containing. Возражения типа "там это через встроенную ф-ию contains" меня не пробивают.

А вообще я уже жалею, что дал себя втянуть в бессмысленный обмен постами. Я сам дурак...

"Каждый кулик..." (c)


 
vuk ©   (2004-09-29 18:38) [26]

to Johnmen ©   (29.09.04 18:27) [25]:
>И если в Оракле есть и такие и другие триггеры, то это понятно
>и осязаемо.
Согласен.

>В своё время писал на 0. Триггеров не было.
Может быть. Я имел дело с 6.5

>Нереализованность containing.
Это часть стандарта SQL?

>А вообще я уже жалею, что дал себя втянуть в бессмысленный
>обмен постами.
Я спросил не из желания защищать MSSQL. Мне действительно интересно. Возможно я не вижу каких-то серьезных проблем. А вдруг мне глаза откроют? :o)

>"Каждый кулик..." (c)
У нас и IB используется в некоторых количествах. Так что про кулика - это малость не по делу. :o)


 
Fay ©   (2004-09-29 20:09) [27]

2 Term   (29.09.04 12:09)
Если Вы знаете чем отличается constraint от триггера, то вопрос должен быть Вам очевиден. Мне так кажется 8)

2 Johnmen ©   (29.09.04 18:01) [23]
А ошибки в IB/FB, приводящие к тому, что left join выполняется как inner join, считаются смешными?
>> А я не замечаю - IB/FB.
Имеется ввиду "тормозит одинаково"?


 
YurikGL ©   (2004-09-29 20:29) [28]

Всегда реализую СЦ с помощью триггеров.


 
Fay ©   (2004-09-29 20:45) [29]

2 YurikGL ©   (29.09.04 20:29) [28]
Если считать СЦ бизнес-правилами, то почему бы и нет? 8)


 
YurikGL ©   (2004-09-29 20:48) [30]


> Fay ©   (29.09.04 20:45) [29]

Можно и так :-) Я собственно и связи один ко многим с помощью триггеров всегда делал. ИМХО проще гораздо. Вызываешь свои ексепшены если надо... Да и вообще гибче и удобнее.


 
Johnmen ©   (2004-09-29 23:01) [31]

>vuk ©  (29.09.04 18:38) [26]

Просто мне показалось, что обмен мнениями скатывается к http://delphimaster.net/view/15-1096463530/
а это абсолютно бессмысленно...Поэтому "кулик" отменяется :)))
Про серьёзные проблемы не скажу, не сталкивался с ними.

>Fay ©  (29.09.04 20:09) [27]
>А ошибки в IB/FB, приводящие к тому, что left join выполняется
>как inner join, считаются смешными?

Пожалуйста поподробней. С конкретным примером.

>Имеется ввиду "тормозит одинаково"?

Имеется в виду то, что сказано, дословно, без иносказаний и подразумеваний...


 
Petr V. Abramov ©   (2004-09-30 00:03) [32]

dont`t use triggers to implement features, built-in Oracle database.
 (C) Oracle Concepts
 Цитата может быть не дословной, и даже ваще не про MSSSQL, но, IMHO, прочтя, имеет смысл задуматься.


 
Fay ©   (2004-09-30 04:59) [33]

2 Johnmen ©   (29.09.04 23:01) [31]
Мне просто показалось, что имеет место наезд на мою любимую СУБД. Причём со стороны FB, с которым я работаю почти каждый день и люто его ненавижу за тормоза, глюки и "недоношенное" всё ваще.

>> Пожалуйста поподробней. С конкретным примером.
Я не полезу сейчас искать описания багов. Но указанную (во что она выливается) ошибку  "исправляют" в каждом релизе.


 
Zacho ©   (2004-09-30 08:27) [34]


> Я не полезу сейчас искать описания багов. Но указанную
> (во что она выливается) ошибку  "исправляют" в каждом
> релизе.

За 6 лет работы с IB ни разу такую ошибку не видел. Может всё-таки конкретный пример приведешь ?

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

У меня - ни тормозов, ни глюков ... Может всё-таки в ручках дело ?


 
Romkin ©   (2004-09-30 09:47) [35]

Fay ©  (30.09.04 04:59) [33] Тормоза? Глюки?! MSSQL-щиков к FB подпускать нельзя :))) И наоборот тоже :)
У меня, например, на тестовой БД Firebird 1.0 делал MSSQL 7 по производительности ;)


 
Romkin ©   (2004-09-30 09:54) [36]

Хотя буквально в понедельник влетел в хорошенький баг FB1.5.1... Только никак тестовый случай не сделаю :(


 
Johnmen ©   (2004-09-30 09:55) [37]

>Romkin ©   (30.09.04 09:54) [36]

Код бага в студию !
:)))


 
Romkin ©   (2004-09-30 10:03) [38]

Johnmen ©  (30.09.04 09:55) [37] Да пытался сделать на днях :((
что-то вроде
for select ns.ID, count(distinct ns.CNT)
 from n join ns on n.ID = ns.ID
 where n.F_ID = ...
 group by ns.id
 into :ID, :COUNT_CNT
do suspend;

Причем в хранимой процедуре только... И именно count distinct... И именно с группировкой. И именно join. И read committed...
А баг оченно неприятный: сервер хавает виртуальную память. Именно виртуальную. И не отдает до упора :((
Понятно, через некоторое время она кончается. Со всеми вытекающими
Вот пытаюсь воспроизвести лабораторно


 
Johnmen ©   (2004-09-30 10:18) [39]

>Romkin ©   (30.09.04 10:03) [38]

Да, это весьма странно...
Надо, действительно, поэкспериментировать. Напр. джоин сделать неявным (from n, ns where n.ID = ns.ID ...) и/или select n.ID, ... group by n.id


 
Romkin ©   (2004-09-30 10:21) [40]

Второе не помогает. Да я уже разомкнул на два, один по ID, другой по count :)


 
Johnmen ©   (2004-09-30 10:28) [41]

>Romkin ©

А в where есть условия а-ля n.Field=ns.Field ?


 
Romkin ©   (2004-09-30 10:42) [42]

Johnmen ©  (30.09.04 10:28) [41] НУ полностью это выглядит как

for select NS.CAT_ID, count(distinct NS.N_ID)
     from (NUMB_STATE NS
           join NUMBER N on (NS.CAT_ID = N.CAT_ID and NS.N_ID = N.ID)
          join OP_TYPE OT on (NS.NSTATE = OT.ID))
     where NS.SDATE <= :DATA and NS.FDATE >= :DATA and OT.INVISIBLE > 0
       and N.PANS_ID = :PANS_ID
       and (N.FRAME_ID = :F_FRAME_ID or :F_FRAME_ID is NULL)
     group by NS.CAT_ID
     into :CAT_ID, :ABSENT_NUM_CNT
   do
     if (ABSENT_NUM_CNT > 0
         and (CAT_ID = F_CAT_ID or F_CAT_ID is NULL)) then
     begin
       select PLACES, DOPPLACES
         from CATEGORY
         where ID = :CAT_ID
       into :CAT_PLACES, :CAT_DOPPLACES;
       NUMBER_ALL = NUMBER_ALL - ABSENT_NUM_CNT;
       PLACES_ALL = PLACES_ALL - ABSENT_NUM_CNT*CAT_PLACES;
       DOPPLACES_ALL = DOPPLACES_ALL - ABSENT_NUM_CNT*CAT_DOPPLACES;
     end


Причем в NUMB_STATE реально одна запись была, не попадающая в условие, т.е. ABSENT_NUM_CNT = 0 постоянно :)


 
YurikGL ©   (2004-09-30 10:55) [43]

Один из глюков СУБД Firebird, я недавно задавал этот вопрос

Использую IBX

В компоненте IbStoredProc в Design Time выбираю имя хранимой поцедуры. При попытке нажать на params вываливается сначала сабж, потом access violation ... "gds32.dll" Read of address 00000000 и делфи зависает...

В систем32 хранится gds32.dll от файрберда. Попытка заменить его на gds32.dll от Ib6.5 разумеется привела к unavalible database.

Оказалось, что в данный глюк возникает, если в транзакции стоит no_wait


 
Johnmen ©   (2004-09-30 11:01) [44]

>Romkin ©  

А вот так если
from NUMB_STATE NS
 join NUMBER N on (NS.CAT_ID = N.CAT_ID and NS.N_ID = N.ID)
 join OP_TYPE OT on (NS.NSTATE = OT.ID)


А вообще удаётся воспроизвести критическую ситуацию ?


 
Romkin ©   (2004-09-30 11:02) [45]

Только что воспроизвел :)) Скрипт интересует?


 
Johnmen ©   (2004-09-30 11:03) [46]

>YurikGL ©   (30.09.04 10:55) [43]

Это глюк IBX.


 
Romkin ©   (2004-09-30 11:03) [47]

YurikGL ©  (30.09.04 10:55) [43] И при чем здесь FIrebird? Обнови IBX :))


 
Johnmen ©   (2004-09-30 11:33) [48]

>Romkin ©   (30.09.04 11:02) [45]

Так ты исследовал проблему ? Удалось избавиться от глюка ? Если да, то что было сделано ?
Какой скрипт ? ХП ты же привел...


 
Romkin ©   (2004-09-30 12:07) [49]

НУ это уже оффтопик. Я тебе скрипт послал на johnmen@mail.ru, лови. Он большой :))
А проблему я решил просто разомкнув запрос на два, сначала CAT_ID, потом - count для этого ида. И все стало в порядке


 
YurikGL ©   (2004-09-30 12:07) [50]


> Romkin ©   (30.09.04 11:03) [47]

Понятно, а откуда?


 
Romkin ©   (2004-09-30 12:13) [51]

YurikGL ©  (30.09.04 12:07) [50] РРР! www.ibase.ru


 
YurikGL ©   (2004-09-30 12:15) [52]


> Romkin ©   (30.09.04 12:13) [51]

А сам ведь не догадался :-)


 
YurikGL ©   (2004-09-30 12:32) [53]


> Romkin ©   (30.09.04 12:13) [51]

Глюк не исчез...



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

Форум: "Базы";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.047 c
1-1097659476
DSP
2004-10-13 13:24
2004.10.31
Сестемное время


1-1098178915
Mishenka
2004-10-19 13:41
2004.10.31
Sender в MenuItem


1-1098100780
Jolik
2004-10-18 15:59
2004.10.31
Exception &amp; Result


1-1097831762
П7
2004-10-15 13:16
2004.10.31
Высота текста с переносами


14-1097582626
1008
2004-10-12 16:03
2004.10.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский