DDD Value Object: Как сохранить объектные объекты без множества соединений SQL? - PullRequest
1 голос
/ 14 февраля 2010

Очевидно, что я ошибаюсь, говоря, что DDD схож с EAV / CR по полезности, но единственное различие, которое я вижу до сих пор, заключается в построении физических таблиц для каждой сущности с большим количеством объединений, а не с тремя таблицами и множеством объединений.

Это должно быть из-за моего отсутствия понимания DDD. Как вы физически сохраняете эти объекты в базе данных без значительных объединений и сложностей при импорте данных? Я знаю, что вы можете просто создавать объекты, которые поступают в ваш репозиторий, но сложно обучать таким инструментам, как Microsoft Sql Server Integration Сервер для использования ваших пользовательских объектов C # и фреймворка. Может быть, это должен быть мой вопрос, как вы используете вашу среду DDD ASP.NET C # со службами интеграции Microsoft SQL Server и службами отчетов? LOL.

В базе данных EAV / CR мы можем настроить одну таблицу Person с разными классами в зависимости от типа человека: поставщик, клиент, покупатель, представитель, компания, уборщик и т. Д. Три таблицы, несколько объединений, атрибуты всегда вставляйте строку с проверкой перед вставкой, так же, как ModelValidation в MVC, где объект принимает любое значение, но не сохраняется до тех пор, пока он не будет действительным.

В стандартной реляционной модели мы использовали для создания таблицы для каждого типа сущности, смешивая с избыточными типами данных, такими как City.

Используя Domain Driven Design, мы используем объекты для представления каждого типа сущности, вложенных объектов для каждого типа ValueObject и других вложенных объектов по мере необходимости. В моем понимании это приводит к таблице для каждого вида сущности и таблице для каждого вида набора информации (объекта значения). Со всеми этими таблицами я вижу много объединений. Мы также заканчиваем тем, что создали физическую таблицу для каждого нового типа контакта. Очевидно, что есть лучший способ, поэтому я должен ошибаться в том, как я сохраняю объекты в базе данных.

Мой продавец выглядит так:

public class Vendor {
    public int vendorID {get; set;}
    public Address vAddress {get; set;}
    public Representative vRep {get;set;}
    public Buyer vBuyer {get; set;}
}

Мой покупатель:

public class Buyer {
   public int buyerID {get; set;}
   public Address bAddress {get; set;}
   public Email bEmail {get; set;}
   public Phone bPhone {get; set;}
   public Phone bFax (get; set;}
}

Действительно ли мы ссылаемся на такие вещи, как Vendor.vBuyer.bPhone.pAreaCode? Я бы подумал, что мы будем ссылаться и хранить Vendor.BuyerPhoneNumber и создавать объекты почти как псевдонимы следующих частей: Vendor.Address1, Vendor.Address2, Vendor.BuyerPhoneNumber ... и т. Д.

Ответы [ 4 ]

1 голос
/ 16 февраля 2010

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

Вы все еще можете использовать проект базы данных EAV / CR , если вы создаете отображения в своем слое объектно-реляционного отображения для преобразования (проецирования) ваших данных в ваши объекты.

Решение о том, как спроектировать ваши объекты и обеспечить доступ к дочерним значениям, на самом деле является отдельным вопросом, который вы должны решать в каждом конкретном случае. Vendor.BuyerPhoneNumber или Vendor.vBuyer.bPhone.pAreaCode? Ответ всегда зависит, потому что он основан на ваших конкретных требованиях.

1 голос
/ 19 февраля 2010

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

1 голос
/ 16 февраля 2010

Вы можете сериализовать ваши объекты в xml и сохранить их в столбце xml на вашем сервере Sql. В конце концов, вы пытаетесь представить иерархическую структуру данных, и именно здесь xml превосходит.

0 голосов
/ 26 февраля 2019

Один из лучших способов хранения доменных объектов - это база данных документов. Это прекрасно работает, потому что транзакционная граница документа идеально совпадает с границей согласованности совокупного корня. Вам не нужно беспокоиться о соединениях или проблемах с отложенной загрузкой. Однако в этом нет особой необходимости, если вы применяете CQRS (о котором я писал ниже).

Недостатком часто является запрос. Если вы хотите напрямую запросить постоянные данные за вашими доменными объектами, вы можете попасть в узлы. Однако это сложность, которую CQRS стремится решить для вас, когда ваши части приложения выполняют запросы, отличные от частей, загружающих / проверяющих / хранящих доменные объекты.

Возможно, у вас есть сложная реализация «Command», которая загружает доменные объекты, вызывает их поведение (помня, что доменные объекты должны иметь поведение и инкапсулируют свои данные, иначе вы рискуете стать «анемичным») перед их сохранением и, возможно, даже публикация событий о том, что произошло.

Затем вы можете использовать эти события для обновления какого-либо другого «хранилища для чтения», хотя это не обязательно. Дело в том, что в вашем приложении реализован совершенно другой вертикальный срез, которому не нужно беспокоиться об этой сложной объектной модели / бизнесе ORM, и вместо этого вы переходите прямо к данным, загружаете именно то, что им нужно, и возвращаете их для отображения в пользователь.

CQRS не жесткий и не сложный. Все указывает на то, что вам нужно иметь отдельный код для:

  1. Обработка команд (которые изменяют состояние и, следовательно, нуждаются в задействованных бизнес-правилах / инвариантах).
  2. Выполнение запросов (которые не изменяют состояние и, следовательно, не нуждаются во всех сложных бизнес-правилах / инвариантах, и поэтому могут "просто" пойти и получить данные эффективным способом.
...