metaclass: (Default)
[personal profile] metaclass
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-запросом :)

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

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

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

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

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

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

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

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

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

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

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

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

(no subject)

From: [identity profile] Дмитрий Васильев - Date: 2013-07-30 06:05 pm (UTC) - Expand

(no subject)

From: [identity profile] sergiej.livejournal.com - Date: 2013-07-30 06:08 pm (UTC) - Expand

(no subject)

From: [identity profile] anonim-legion.livejournal.com - Date: 2013-07-30 07:08 pm (UTC) - Expand

(no subject)

From: [identity profile] plumqqz.livejournal.com - Date: 2013-07-30 08:56 pm (UTC) - Expand

(no subject)

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

(no subject)

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

(no subject)

From: [identity profile] bydlorus.livejournal.com - Date: 2013-07-30 06:51 pm (UTC) - Expand

(no subject)

From: [identity profile] sergiej.livejournal.com - Date: 2013-07-30 06:53 pm (UTC) - Expand

(no subject)

From: [identity profile] sergiej.livejournal.com - Date: 2013-07-30 06:55 pm (UTC) - Expand

(no subject)

From: [identity profile] bydlorus.livejournal.com - Date: 2013-07-30 06:58 pm (UTC) - Expand

(no subject)

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

(no subject)

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

(no subject)

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

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

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

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

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

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

(no subject)

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

(no subject)

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

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

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

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

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

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

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

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

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

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

(no subject)

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

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

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

(no subject)

From: [identity profile] zelanton.livejournal.com - Date: 2013-07-30 08:05 pm (UTC) - Expand

(no subject)

From: [identity profile] zelanton.livejournal.com - Date: 2013-07-30 08:12 pm (UTC) - Expand

(no subject)

From: [identity profile] dennab.livejournal.com - Date: 2013-07-31 02:00 pm (UTC) - Expand

(no subject)

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 22nd, 2025 01:55 pm
Powered by Dreamwidth Studios