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 06:03 pm (UTC)(link)
Ок, я соглашусь что умные констрейнты на технических ключах - хороший способ лишний раз прикрыть задницу. Я больше о констрейнтах на собственно данных.

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

Боюсь, ваша система будет одним большим рейс кондишеном.
PS: разрешите полюбопытствовать - вы на джаве пишите?

[identity profile] metaclass.livejournal.com 2013-07-30 06:06 pm (UTC)(link)
Первое предложение звучит как адский болезненный бред. Что имелось в виду?

[identity profile] sergiej.livejournal.com 2013-07-30 06:08 pm (UTC)(link)
"Боюсь, ваша система будет одним большим рейс кондишеном."
нет, не вся, а только подсистема, занимающаяся ORM и прочим адом.

Ну я лично давно почти не пишу, но писал на джаве, да, конечно кровавый энтерпрайз.

[identity profile] vinslivins.livejournal.com 2013-07-30 06:18 pm (UTC)(link)
мы хорошие :)

[identity profile] sergiej.livejournal.com 2013-07-30 06:19 pm (UTC)(link)
Ну если мы говорим о ФК, то вопрос связать два объекта в базе, когда может понадобиться констрейнт? Когда единственная валидная связь это один к одному. А почему он может понадобиться? Потому что кривые ручки создавая НОВЫЙ объект в "этой" таблице (где ФК) вместо того чтобы создать НОВЫЙ же объект в "чужой" таблице, взяли и зарелейтили на существующий, это конкретный фейл на уровне "наплевать на модель данных приложения", констрейнт тут чисто костыль.

[identity profile] vinslivins.livejournal.com 2013-07-30 06:19 pm (UTC)(link)
а можно спросить, каким образом был отправлен скл запрос не из моделей рельсов?

предполагается, что в базу данных лазют рельсы, и только рельсы.

если надо кому-то ещё - слава богу делать веб-сервисы можно практически генератором.

[identity profile] vinslivins.livejournal.com 2013-07-30 06:20 pm (UTC)(link)
ну или если запрос скл шлют рельсы, наверное он был заранее оттестирован в тестовой базе соответствующим тестом?

[identity profile] sergiej.livejournal.com 2013-07-30 06:21 pm (UTC)(link)
:) быдлокодер поговорил с быдлорусом :)

[identity profile] metaclass.livejournal.com 2013-07-30 06:28 pm (UTC)(link)
mysql -u hipsteruser -phipsterpassword
>insert into HipsterCustomers(name) values('testhipster');

все, приложение умирает на NULL/nil в одном из полей :)

[personal profile] ex0_planet 2013-07-30 06:40 pm (UTC)(link)
я не олег, но здесь-то что не так?

[identity profile] vinslivins.livejournal.com 2013-07-30 06:44 pm (UTC)(link)
[13] pry(main)> Url.create!
(0.2ms) BEGIN
Resource Exists (0.6ms) SELECT 1 AS one FROM `resources` WHERE `resources`.`uuid` IS NULL LIMIT 1
(0.1ms) ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Resource uuid can't be blank, Url can't be blank
from /home/v/.rvm/gems/ruby-1.9.3-p448/gems/pry-exception_explorer-0.1.9/lib/pry-exception_explorer/core_ext.rb:46:in `raise'
[14] pry(main)>

(опа, приложение живёт =)

[identity profile] bydlorus.livejournal.com 2013-07-30 06:51 pm (UTC)(link)
Вообще не въехал, почему это фк это один-к-одному?

[identity profile] sergiej.livejournal.com 2013-07-30 06:53 pm (UTC)(link)
хорошо, зачем тебе констрейнт на поле с ФК в таблице? Может это я не вьехал.

[identity profile] sergiej.livejournal.com 2013-07-30 06:55 pm (UTC)(link)
А блин я тупой
я про уникальный констрейнт с самого начала туплю. Сорри.

[identity profile] bydlorus.livejournal.com 2013-07-30 06:58 pm (UTC)(link)
А ну слава богу, а то беседа начала приобретать сюрреалистические черты ;-)

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

[identity profile] metaclass.livejournal.com 2013-07-30 07:05 pm (UTC)(link)
Вот, а я было уже подумал, что мир псоглавцы захватили пока я спал :)

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

[identity profile] anonim-legion.livejournal.com 2013-07-30 07:08 pm (UTC)(link)
>ваша система будет одним большим рейс кондишеном.

Где же Крокодил, когда он так нужен? Тут ересь пишут, а карать некому.

[identity profile] falcrum.livejournal.com 2013-07-30 07:25 pm (UTC)(link)
Архип'авильно! Были прен-цен-ден-ты... :(

[identity profile] sergiej.livejournal.com 2013-07-30 07:31 pm (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] henu3detb.livejournal.com 2013-07-30 07:53 pm (UTC)(link)
А вот не надо ничего удалять )

Page 2 of 4