metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2013-07-30 08:07 pm

Рельсы и констрейнты в БД

http://guides.rubyonrails.org/migrations.html#active-record-and-referential-integrity
"The Active Record way claims that intelligence belongs in your models, not in the database. As such, features such as triggers or foreign key constraints, which push some of that intelligence back into the database, are not heavily used."

В ActiveRecord червь не рекомендует делать констрейнты в БД. Это огорчение, т.к. например, я сломал к хуям (т.е. до невозможности вообще хоть что-либо сделать из UI) хипстерское веб-приложение одним SQL-запросом :)

[identity profile] sergiej.livejournal.com 2013-07-30 05:19 pm (UTC)(link)
С констрейнтами практически всегда больше проблем чем помощи. Если вдруг хочется оставить контроль базе, то потом блин всё равно позаботься завернуть вылетевший на базе констрейнт эксепшн в логику приложения, а это никак не меньше работы чем позаботиться о данных до попытки запихнуть их тупо.

[identity profile] bydlorus.livejournal.com 2013-07-30 05:35 pm (UTC)(link)
С обработкой ошибок всегда больше проблем чем помощи :-)

[identity profile] sergiej.livejournal.com 2013-07-30 05:38 pm (UTC)(link)
Ну можно конечно не обрабатывать, а тупо показать юзеру или бросить обратно по интерморде. Но не думаю что юзер будет доволен таким оборотом событий

[identity profile] bydl0coder.livejournal.com 2013-07-30 05:41 pm (UTC)(link)
Есть еще уличная магия - обработать и показать нетупо. Не все владеют, конечно.

[identity profile] sergiej.livejournal.com 2013-07-30 05:51 pm (UTC)(link)
Но возни с этим столько, что имхо в большинстве случаев проще побеспокоиться о качестве данных ДО инсертов.
Постоянно сталкиваюсь с ситуацией, когла приложение "ожидало" что на базе будет констрейнт. Потом криворукие снимают консрейнт, потому что бизнес задолбал и "разрешил" дубли, потому что могут, а в приложение залезть не могут. Так что обработка консистентности данных на уровне приложения это ещё и буфер от хитрозадых бизнесов

[identity profile] bydlorus.livejournal.com 2013-07-30 05:41 pm (UTC)(link)
А можно в вызовах библиотеки входные параметры не проверять и ArgumentException не кидать, т.к. "придётся позаботиться завернуть вылетевший эксепшн в логику приложения, а это никак не меньше работы чем позаботиться о данных до попытки передать их тупо."

Т.е. логика немного кривая. Забота о целостности данных должна быть везде. Если мы, конечно, говорим о referential integrity а не о проверке возвраста пользователя в триггерах.

[identity profile] sergiej.livejournal.com 2013-07-30 05:53 pm (UTC)(link)
Если в дополнение к проверке приложением есть ещё и констрейнт то я не против, если конечно на производительность не влияет, при больших таблицах - влияет.

[identity profile] henu3detb.livejournal.com 2013-07-30 05:37 pm (UTC)(link)
Лучше пусть в продакшне будет необработанный эксепшн, чем неконсистентные данные, которые боком начнут вылазить через пол года на другой машине на другом континенте. Вот тогда будет точно ребус, откуда оно.

[identity profile] sergiej.livejournal.com 2013-07-30 05:41 pm (UTC)(link)
ну это самое то для бац-бац и в продакшн. Сначала расставляешь констрейнты, потом по факты их вылезания оборачиваешь в приложение. Тоже валидный подход для писателей на коленке.

[identity profile] bydlorus.livejournal.com 2013-07-30 05:44 pm (UTC)(link)
Вообще-то FK - это метаданные, которые зачастую сами по себе весьма полезны. По ним можно генерить всякую инфу. Например, я как-то писал прогу, которая из базы выдирает только данные, связанные с определённым проектом - от таблицы Projects по FK расходилась выборка нужного (анальные корпоративные правила не позволяли высылать всю базу).

[identity profile] sergiej.livejournal.com 2013-07-30 05:55 pm (UTC)(link)
Если правильно сделана система связывания по ФК, то всё будет ок без констрейнтов. Опять же обязательное условие чтобы никто в базу ручками не лазил чтобы что-то по-быстряку инсертнуть

(no subject)

[identity profile] sergiej.livejournal.com - 2013-07-30 18:08 (UTC) - Expand

(no subject)

[identity profile] plumqqz.livejournal.com - 2013-07-30 20:56 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2013-07-30 18:06 (UTC) - Expand

(no subject)

[identity profile] sergiej.livejournal.com - 2013-07-30 18:19 (UTC) - Expand

(no subject)

[identity profile] bydlorus.livejournal.com - 2013-07-30 18:51 (UTC) - Expand

(no subject)

[identity profile] sergiej.livejournal.com - 2013-07-30 18:53 (UTC) - Expand

(no subject)

[identity profile] sergiej.livejournal.com - 2013-07-30 18:55 (UTC) - Expand

(no subject)

[identity profile] bydlorus.livejournal.com - 2013-07-30 18:58 (UTC) - Expand

(no subject)

[identity profile] sergiej.livejournal.com - 2013-07-30 19:03 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2013-07-30 19:05 (UTC) - Expand

(no subject)

[identity profile] sergiej.livejournal.com - 2013-07-30 19:06 (UTC) - Expand

[identity profile] henu3detb.livejournal.com 2013-07-30 06:00 pm (UTC)(link)
Может оно и самое то, но для обычного вдумчивого подхода, для людей которые хотят выпускать стабильные приложения, констрейнты тоже подходят.

[identity profile] sergiej.livejournal.com 2013-07-30 06:03 pm (UTC)(link)
Ок, я соглашусь что умные констрейнты на технических ключах - хороший способ лишний раз прикрыть задницу. Я больше о констрейнтах на собственно данных.

[identity profile] metaclass.livejournal.com 2013-07-30 05:37 pm (UTC)(link)
Констрейнты что до базы (в UI), что после базы обрабатываются достаточно однообразно, главное сунуть обработчик в точку через которую запросы ходят.
Зато при их наличии гарантированно, что внешние псы ходящие в базу, приложение не попортят.

[identity profile] sergiej.livejournal.com 2013-07-30 05:41 pm (UTC)(link)
" что внешние псы ходящие в базу, приложение не попортят."
Расстреливать сразу

[identity profile] sergiej.livejournal.com 2013-07-30 05:48 pm (UTC)(link)
Внутри легаси я согласен на любой ад, однако легаси лазить в новое приложение через базу никогда не разрешу, даже если рукожопые сэкономят на этом человекомесяцы - мне пофиг. Если поднимают хай, я поднимаю вопрос рисков и безопасности до топ манагеров.

(no subject)

[identity profile] falcrum.livejournal.com - 2013-07-30 19:25 (UTC) - Expand

(no subject)

[identity profile] sergiej.livejournal.com - 2013-07-30 19:31 (UTC) - Expand

[identity profile] fraks-nsk.livejournal.com 2013-07-31 09:40 am (UTC)(link)
Гм... Вообще-то люди не идеальны, в том числе и вы. Констрейнты позволяют максимально просто и быстро объявить ограничения со 100% их соблюдением. А в приложении оно будет реализовано не сразу, забыл, не подумал, отвлекся, "потом"...

[identity profile] sergiej.livejournal.com 2013-07-31 09:44 am (UTC)(link)
так я же соглашаюсь, как временные костыли и как последняя инстанция для прикрытия задницы - очень даже, но не как основа логики приложения.

[identity profile] zelanton.livejournal.com 2013-07-30 07:45 pm (UTC)(link)
А потом удаление записей превращается в ебанный секс, когда структура данных превращается в сеть, где объекты сами на себя ссылаются через 10 разных путей. И хуячь триггеры, процедуры, получай вендор лок. Особенно пиздато, когда в каком-нибудь оракле от всех этих триггеров и процедур приползают блокировки страниц или другое подобное веселье. Или тот же MSSQL с ограничением вложенности рекурсии.

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

[identity profile] metaclass.livejournal.com 2013-07-30 07:53 pm (UTC)(link)
Рекурсивные зависимости в базе?

[identity profile] zelanton.livejournal.com 2013-07-30 08:02 pm (UTC)(link)
ну. Кстати у FB с этим беда (многие триггеры не тупо создаются, уж не помню с какими формулировками). Если я ничего не путаю, а могу, т.к. натрахавшись с триггерами я на них уже забил и делаю кодом - в каждой СУБД свои уникальные грабли, превращающие кросплатформенную работу с тригерамми в кромешный адъ. Только код, а заодно никакого вендор-лока. Но там свои грабли)

(no subject)

[identity profile] fraks-nsk.livejournal.com - 2013-07-31 01:39 (UTC) - Expand

(no subject)

[identity profile] ext_1684112 - 2013-07-31 10:57 (UTC) - Expand

(no subject)

[identity profile] zelanton.livejournal.com - 2013-07-31 11:09 (UTC) - Expand

(no subject)

[identity profile] ext_1684112 - 2013-07-31 11:16 (UTC) - Expand

(no subject)

[identity profile] zelanton.livejournal.com - 2013-07-31 11:19 (UTC) - Expand

(no subject)

[identity profile] ext_1684112 - 2013-07-31 12:22 (UTC) - Expand

(no subject)

[identity profile] zelanton.livejournal.com - 2013-07-31 12:50 (UTC) - Expand

[identity profile] henu3detb.livejournal.com 2013-07-30 07:53 pm (UTC)(link)
А вот не надо ничего удалять )

[identity profile] zelanton.livejournal.com 2013-07-30 07:59 pm (UTC)(link)
Лопнет

может например удалятся через настраиваемое время (n-лет) после пребывания в статусе "как бы удалено". Или вообще не удаляться. Это уж как юзеру угодно будет, схему жизненного цикла объекта пускай правит, где-то оно надо, где-то - мешает, по ситуации. Но вообще сама возможность удаления в ситуация когда связей уже пиздец сколько и oracle/mssql ебанётся на каком-нибудь случае.

(no subject)

[identity profile] fraks-nsk.livejournal.com - 2013-07-31 01:38 (UTC) - Expand

[identity profile] vp.livejournal.com 2013-07-30 08:03 pm (UTC)(link)
"никого в базу не пускать"

А самого себя инстансов так 100 если, да все на одну базу?

(no subject)

[identity profile] zelanton.livejournal.com - 2013-07-30 20:05 (UTC) - Expand

(no subject)

[identity profile] zelanton.livejournal.com - 2013-07-30 20:12 (UTC) - Expand

(no subject)

[identity profile] dennab.livejournal.com - 2013-07-31 14:00 (UTC) - Expand

(no subject)

[identity profile] zelanton.livejournal.com - 2013-07-31 19:18 (UTC) - Expand