metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-10-19 10:23 pm
Entry tags:

Бизнес-логика: Структура данных vs код

[livejournal.com profile] plumqqz доставил нам очередную ссылку на ужасы обсуждения БД на хабре. Сама статья еще куда ни шло, за исключением представления constraints как мега-фичи (вроде это основа основ любой БД). В комментариях, само собой, дикий ад, трэш, угар, содомия, коровники, заборы, катаформизм хабракармы и голые бизнес-аналитекши.

Самое ужасное там - это когда структуре данных отказывают в праве считаться частью бизнес-логики, упирая на то, что "надо же абстрагироваться от хранилища".
При этом, даже если добится этого абстрагирования - то все равно структура данных будет в памяти, в виде графа объектов, будет нужен дополнительный код по интеграции этой структуры с тем, что живет в БД, и никуда мы от структуры данных не денемся. А уж про то, можно ли считать констрейнты (в т.ч. и сложные, выражаемые только в виде триггеров) частью типов данных - можно дискутировать вечно. По крайней мере, check и foreign key constraints это точно часть типа данных, в случае FK - это еще и зависимые типы, реализованные в понятном виде. В случае unique constraints - уже сложнее, но по идее, тоже зависимый тип (зависит от данных таблицы, в которой он используется).

Так вот, я считаю, что структура данных для бизнес-логики гораздо более важна, чем собственно код. Если вам скажут, что теперь операция с кодом "777029" не облагается НДС - вам всего лишь нужно добавить веточку в паттерн-матчинг. Структура программы от этого не изменится и коллегам вы билд нахрен не сломаете.
А если окажется, что для того, чтобы узнать, как обрабатывается операция, вам нужно заглянуть в настройки в СУБД - то внезапно, в гламурно-причесанной функционально-иммутабельной функции проверки условий появляется грязная монада IO, провайдеры коннектов к БД, автоматическое управление транзакциями, пул коннектов, кэши и прочая черняга и структура данных (к коей я отношу так же и сигнатуры функций) меняется весьма заметно. Альтернативный вариант - оставить функцию чистой, но добавить к ней еще параметров, передаваемых извне, проверить код коллег, записать в трекер и рассказать, что теперь без передачи в нее оккультного набора параметров функция больше не заработает.

[identity profile] falcrum.livejournal.com 2012-10-19 07:31 pm (UTC)(link)
Особенно хорошо чувствуешь важность структуры БД, когда всё уже Х лет работает и поменять нет никакой возможности: просто смотришь с тоской и думаешь - э-эх, вот писал бы это я сейчас...

[identity profile] maxdz.livejournal.com 2012-10-19 07:59 pm (UTC)(link)
В годы моего детства, когда я ещё участвовал в написании ЕРП-подобных систем - хранение бизнес-логики в хранимых процедурах было большим "no-no", т.к. функциональность предметной области не должна размываться между кодом и БД.

Если несколько разных подсистем обращаются некоторым одинаковым образом к БД - можно подумать о том, чтобы выделить такие повторяющиеся (и достаточно низкоуровневые, относительно содержимого БД) функции в хранимые процедуры, чтобы избежать дублирования. Но не бизнес-логику.

Ограничения в БД могут быть, но могут и не быть, т.к. бизнес-логика, как правило, накладывает свои (сужающие, заложенные в структуре БД) ограничения.

[identity profile] theiced.livejournal.com 2012-10-19 10:08 pm (UTC)(link)
а ты иди пятый прогресс бар приделывай

(no subject)

[identity profile] maxdz.livejournal.com - 2012-10-19 22:19 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-19 22:40 (UTC) - Expand

(no subject)

[identity profile] maxdz.livejournal.com - 2012-10-19 22:49 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-19 23:18 (UTC) - Expand

(no subject)

[identity profile] maxdz.livejournal.com - 2012-10-19 23:45 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-19 23:52 (UTC) - Expand

(no subject)

[identity profile] maxdz.livejournal.com - 2012-10-19 23:53 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-19 23:57 (UTC) - Expand

(no subject)

[identity profile] maxdz.livejournal.com - 2012-10-19 23:58 (UTC) - Expand

[identity profile] justy-tylor.livejournal.com 2012-10-19 08:05 pm (UTC)(link)
Строгую границу между "что часть системы типов, а что нет" обычно хрен проведёшь, ибо для этого надобна разница между типом и не-типом, коей в природе не наблюдается. Удобно считать типом то, что пользует не более O(log размер_таблицы), а остальное относить к сессиям верификации датасета.

Про важность структуры данных большое ДА! Если данные (и их модальности) не проебали, то их можно хоть через сто лет обработать новым кодом под новые обстоятельства. А если опаньки, то криптоархеологи и вуду-ритуалы не спасут.

[identity profile] lazy-flyer.livejournal.com 2012-10-19 08:30 pm (UTC)(link)
Ребе, у вас снова появилось много значений слова invoice...
Безнес-логика бизнеса? Или бизнес-логика раеализации бизнес-логики?
В первом случае структуры данных этой логике пох, она на другом уровне оперирует...

[identity profile] metaclass.livejournal.com 2012-10-19 08:36 pm (UTC)(link)
Например, появление новой сущности в первичных документах: не особо меняет логику работы, но заметно меняет структуру БД, структуру графа объектов в памяти клиента или сервера приложений.

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

(no subject)

[identity profile] lazy-flyer.livejournal.com - 2012-10-19 20:41 (UTC) - Expand

[identity profile] zelanton.livejournal.com 2012-10-19 09:00 pm (UTC)(link)
не читал, но осуждаю скажу за entity–attribute–value model поверх реляционной БД и любая хня данных настраивается по месту, а бизнес-логика от данных реально абстрагирована и вообще она на 83% настраивается внедренцем по месту, в гламурной административной консольке.

[identity profile] metaclass.livejournal.com 2012-10-19 09:10 pm (UTC)(link)
Упоминали ли разработчики оного зависимые типы и бенджамина пирса?:)

(no subject)

[identity profile] zelanton.livejournal.com - 2012-10-20 08:01 (UTC) - Expand

[identity profile] pascendi.livejournal.com 2012-10-19 09:04 pm (UTC)(link)
Вот только сегодня ругался на эту тему.
Есть, есть люди, которые считают, что бизнес-логика должна быть в BPMS, а в структуре данных (АКА информационный объект) не должно быть сведений о текущем статусе этого объекта...

[identity profile] sergiej.livejournal.com 2012-10-20 12:45 am (UTC)(link)
А ничо если в разных процессах статусы одного и того же объекта разные?

(no subject)

[identity profile] pascendi.livejournal.com - 2012-10-20 10:26 (UTC) - Expand

[identity profile] nivanych.livejournal.com 2012-10-19 09:05 pm (UTC)(link)
У вас тут не хабр, с вами тут, почему-то, особенно не спорят...
А про структуры данных — надо сначала определить, что такое данные.
Вот например, лямбдо-исчислёниё-функция — это данные? ;-)
А то вот, замкнулись в своём SQL!
Есличо, я тут не говорю, что как будто, в этом есть что-то плохое ;-)

[identity profile] metaclass.livejournal.com 2012-10-19 09:12 pm (UTC)(link)
Я забыл про это написать, что для начала код это тоже данные, и типы это данные и вообще все данные, просто с разным поведением:)

(no subject)

(Anonymous) - 2012-10-19 21:45 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-10-20 06:07 (UTC) - Expand

(Anonymous) 2012-10-19 09:12 pm (UTC)(link)
Ну я тут неделю писал, а потом вложил это все в структуру и получил код в 1% от прошлого. Но я не пойму почему вы так уверенны что все ПО живет 1 день и что оно (ПО) завтра не потребует давать ответы на те вопросы на которые оно даже не проектировалось.

[identity profile] fd979.livejournal.com 2012-10-19 09:45 pm (UTC)(link)
есть такая серьезная контора, которая одно время запрещала программерам создавать новые таблицы, но новый функционал требовала :)

а вы тут бизнес-логика, структура даанных :)

(Anonymous) 2012-10-19 10:25 pm (UTC)(link)
Это что за бред? Оксюморон какой, то. 1) Серьезная и запрещала и 2) програмистам

[identity profile] bydl0coder.livejournal.com 2012-10-20 02:18 am (UTC)(link)
И мне так говорят, и правильно делают. Для коров восьмидесятого уровня РСУБД не нужны.

[identity profile] sgalitsky.livejournal.com 2012-10-19 09:46 pm (UTC)(link)
> В комментариях, само собой, дикий ад, трэш, угар, содомия, коровники, заборы, катаформизм хабракармы и голые бизнес-аналитекши.
- да унылое говно в каментах на самом деле. т.е. вот реально там например отличился не совсем мудак в споре с мускулистым совсем мудаком. похабнейшее зрелище.
какие-то отморози, называщие постгре "постгрой".
и как всегда, 100% участников этого блядского срача вообще никогда не работали с ораклями.
т.е. вот даже не с Database'ом не работали, не говоря уШ о мидлваре, соа там или бпм.

это например мода такая в говне и торфе рассуждать о незнакомых и чуждЫх вещах?

[identity profile] theiced.livejournal.com 2012-10-19 10:08 pm (UTC)(link)
зачем вы читаете то что пишет этот идиот?

[identity profile] hazardouskadavr.livejournal.com 2012-10-19 10:57 pm (UTC)(link)
Вот я, конечно, за себя скажу, но я читаю это по той же причине, что и вас, благородный сэр
А уж что за причина - это явно никому не интересно

[identity profile] zamotivator.livejournal.com 2012-10-19 11:19 pm (UTC)(link)
Потому что он умный.

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-19 23:23 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-19 23:25 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-19 23:31 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-19 23:28 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2012-10-19 23:30 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-19 23:37 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-19 23:51 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-19 23:58 (UTC) - Expand

(no subject)

[identity profile] bydl0coder.livejournal.com - 2012-10-20 02:27 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2012-10-20 09:27 (UTC) - Expand

[identity profile] metaclass.livejournal.com 2012-10-20 06:38 am (UTC)(link)
А кого еще читать среди засилья монг, риаков, JSON-сериализации артурегами и мемкэшей.

[identity profile] bydl0coder.livejournal.com 2012-10-20 02:14 am (UTC)(link)
"Просто надо писать хороший код и не писать плохой". В подходе "фигачим всю логику в БД" мне помимо всего прочего не нравится количество уличной магии, которую надо знать. Чем дороже БД, тем уличной магии меньше, но в обычных языках программирования ее просто нет.

[identity profile] vp.livejournal.com 2012-10-20 06:03 am (UTC)(link)
Ты не поверишь, вчера в реале обсуждали детали реализации одного продукта, стоящего сумасшедшие деньги, цель которого - автоматическая миграция каких угодно данных между базами. Ну ты сам понимаешь, что при этом функционал баз не должен использоваться желательно вообще. Есть какой-то странный постулат, исходящий, скорее всего, от менеджеров, что "этим пользоваться нельзя". Вот от того потом все подобные речи и возникают. А народ затем в 10001 раз изобретает велосипеды, повторяя функционал БД у себя в среднем слое или на клиенте.

[identity profile] theiced.livejournal.com 2012-10-20 06:13 am (UTC)(link)
за использование хранимых говнопроцедур - вон из пофессии.

(no subject)

[identity profile] vp.livejournal.com - 2012-10-20 06:23 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 08:55 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2012-10-20 09:28 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-20 09:45 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 09:47 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-20 09:50 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-20 10:02 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-20 10:18 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 11:23 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-20 12:29 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 12:42 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-20 12:44 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 12:53 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 12:58 (UTC) - Expand

(no subject)

[identity profile] stdray.livejournal.com - 2012-10-20 14:39 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-20 15:07 (UTC) - Expand

(no subject)

[identity profile] stdray.livejournal.com - 2012-10-20 18:10 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 21:22 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-20 15:17 (UTC) - Expand

(no subject)

[identity profile] stdray.livejournal.com - 2012-10-20 17:35 (UTC) - Expand

(no subject)

[identity profile] firebie.livejournal.com - 2012-10-20 19:19 (UTC) - Expand

(no subject)

[identity profile] stdray.livejournal.com - 2012-10-20 19:39 (UTC) - Expand

(no subject)

[identity profile] firebie.livejournal.com - 2012-10-20 19:46 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 21:21 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-20 21:30 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 21:35 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-20 21:38 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 21:41 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-20 21:49 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-21 07:38 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-21 08:08 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-21 08:54 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-21 09:05 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-21 09:05 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-20 21:45 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 21:50 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-20 22:07 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 22:15 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-20 22:30 (UTC) - Expand

(no subject)

[identity profile] blackyblack.livejournal.com - 2012-10-22 06:36 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-21 07:40 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-21 08:09 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-21 08:16 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-21 08:54 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-21 09:06 (UTC) - Expand

(no subject)

(Anonymous) - 2012-10-22 08:35 (UTC) - Expand

(no subject)

[identity profile] norguhtar.livejournal.com - 2012-10-22 03:23 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-20 15:08 (UTC) - Expand

(no subject)

[identity profile] 9zloy.livejournal.com - 2012-10-20 13:11 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 11:28 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-10-20 12:31 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 12:43 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-20 15:06 (UTC) - Expand

(no subject)

[identity profile] norguhtar.livejournal.com - 2012-10-22 03:27 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 16:44 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 21:24 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 21:32 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 21:39 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 21:43 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 21:49 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 21:55 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 22:00 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 22:02 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 22:05 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 22:11 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 22:17 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 22:24 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 22:29 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 22:34 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-20 22:42 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 22:44 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-10-20 22:34 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-10-20 22:52 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 22:57 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 23:04 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 22:38 (UTC) - Expand

(no subject)

[identity profile] sgalitsky.livejournal.com - 2012-10-20 21:50 (UTC) - Expand

(no subject)

[identity profile] dennab.livejournal.com - 2012-10-20 13:20 (UTC) - Expand

[identity profile] trueblacker.livejournal.com 2012-10-20 06:20 am (UTC)(link)
взаимосвязи сущностей предметной области не являются частью бизнес-логики? Ну извините... Ах да, это же про русский бизнес, наверное