Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Любая реализация объектной модели несет в себе следы ограничений ее интепретатора. Будь то JIT или SQL.
Вопрос в том, может ли ORM получив некоторую дополнительную информацию об объектной модели в терминах этой модели создать индексы
А так же можно ли использовать ту же самую информацию в других местах: например при генерации UI опускать создание контролов для фильтрации если у нас мало элементов в коллекции и, наоборот, предлагать фильтрацию по умолчанию по важным признакам.
Есть объектная модель — не важно как получена, надо построить реляционную базу по ней.
Есть ли правила по которым проектировщик строит базу в зависимости от объектной модели и нельзя ли закодировать эти правила?
В каждом сложном UI есть простые куски.
Я предлагаю рассмотреть такую задачу. Так как у нас ORM а не что-то еще.
Что там с построением индексов?
Мне бы хотелось максимально абстрагироваться от хранилища. Идеально строить объектную модель предметной области (хоть и с небольшой оглядкой на модель хранения)
ORM брало на себя весь меппинг, как структурный так и поведенческий.
Почему они противоречат?
Дык я ж говорил что идеал недостижим — хотелось бы к нему приблизиться максимально.
Я об этом и говорю — и так всегда было — стремимся к идеалу, но учитываем ограничения
Пока выбираю термос, но интересно, можно ли его сделать тонким и легким как чашка
Это просто один из вариантов использования слова «идеал» — не достижимая цель, к которой можно только приблизиться. Виртуальная точка, задающая направление.
изначально мы индексы ставим у случайных полей и смотрим, быстро ли выполнился запрос.
Для аналитики нужны спецы предметной области (бухгалтеры всякие, хз, уж Я-то точно не спец в документообороте) для определения, что у нас критично, а что нет, и аналитик, который это формализует в итоговую формулу: бд тут вообще не причем, О-нотация наше всё.
Что значит «быстро ли выполнился запрос»? Какой запрос? В каких условиях?
А в оставшихся 0.1% случаев не всякий DBA сделает лучше
Галочка — это очевидный пользователю способ включения индекса для ускорения отбора и сортировки по конкретному полю
Например, в настройках свойств регистров нет ничего про индексы и процедуры, они создаются автоматически, в зависимости от состава измерений,
взаимосвязей
ORM хороши, когда у нас для обработки внешних воздействий (согласование заказа, приёмка поступления) используется какая-то сложная логика, которую хорошо выражать в терминах сущностей, меняющих своё состояние. Наоборот, отчёты ничего не модифицируют, зато для них нужны сложные критерии выборки и хардкорно оптимизированные запросы, поэтому для них я использую raw SQL.
А как в рамках CQRS обеспечивается непротиворечивость представления двух потоков о хранимых данных?
И недублирование кода?
соблюдается соотношение, что возраст на дату X = X — Дата рождения
А они всегда структурно 100% различные например при записи у нас есть Имя подразделения, в при чтении Цвет мячика?
вот, допустим, у нас есть приложение которое показывает формочку для ввода даты рождения и показывает возраст в процессе ввода. Отдельно у нас есть некая штука которая показывает статистику по работникам в разрезе возраста. Я так понимаю что в рамках CQRS эти две штуки должны быть разделены, но в то же время хочется контроля целостности концепций между потоками.
А при записи наименование подразделения есть?
The change that CQRS introduces is to split that conceptual model into separate models for update and display, which it refers to as Command and Query respectively following the vocabulary of CommandQuerySeparation.
Фаулер описывает CQRS иначе.
UpdateCommand<Customer>() и GetObjectQuery<Customer>, и это все еще ничему не будет противоречить.Термин «поток данных» в рамках объектно-ориентированного проектирования вообще представляется мне туманным. Может быть, я вас неправильно понял?
This separation however enables us to do many interesting things architecturally, the largest is that it forces a break of the mental retardation that because the two use the same data they should also use the same data model.
Я не думаю, что стоит называть CQRS любую архитектуру, в которой есть чтение и запись данных в разных объектах. Фундаментальное отличие CQRS в том, что для чтения и для записи используются различные модели вплоть до уровня базы данных (разные таблицы).
Applying CQRS on this would result in two services
CustomerWriteService
[...]
CustomerReadService
[...]
That is it. That is the entirety of the CQRS pattern. There is nothing more to it than that…
А вот если в архитектуре есть денормализованная таблица UserData, содержащая все денормализованные данные пользователей (Query table), и серия таблиц, содержащих все данные, требуемые для построения этой таблицы на любой момент времени (Command Tables) — такого рода архитектуру (вместе с объектами, которые ее поддерживают, конечно) я бы назвал CQRS.
Настройка БД для каскадного удаления — один из примеров проникновения логики предметной области в логику сохранения данных.
Принцип разделения ответственности и ORM