Я обнаружил, что CouchDB отлично подходит для доменного дизайна (DDD). В частности, CouchDB очень хорошо соответствует шаблонам и методам построения блоков, найденным в DDD. Два из этих строительных блоков включают в себя сущности и объекты стоимости . Сущности — это объекты, определенные потоком непрерывности и идентичности. Объект значения «представляет собой объект, который описывает некоторую характеристику или атрибут, но не несет в себе понятия идентичности». Значения объектов должны рассматриваться как неизменные.
Агрегаты — это группы связанных сущностей и объектов значений. Внутри совокупности один член обозначается как Совокупный корень . Внешние ссылки ограничены только совокупным корнем. Агрегаты должны следовать границам транзакций, распределения и параллелизма. Угадайте, что еще определяется границами транзакций, распределения и параллелизма? Это верно, документы JSON в CouchDB.
Давайте рассмотрим пример Aggregate, представляющий запись в блоге и связанные метаданные. Обратите внимание, что следующие UML-диаграммы предназначены для классов в PHP, но это должно быть достаточно просто, чтобы перевести эти примеры на любой объектно-ориентированный язык программирования. Мы начнем с Entry Entity, которая будет служить нашим Совокупным корнем:
----------------------------------------- | Entry ----------------------------------------- |+ id : string |+ rev : string |+ title : Text |+ updated : Date |+ authors : Person[*] |+ content : Text ----------------------------------------- |+ __construct(entry : array) : void |+ toArray() : array -----------------------------------------
Объект текстового значения:
---------------------------------------------- | Text ---------------------------------------------- |- type : string |- text : string ---------------------------------------------- |+ __construct(type : string, text : string) |+ toArray() : array ----------------------------------------------
Объект значения даты:
-------------------------------------- | Date -------------------------------------- |- timestamp : integer -------------------------------------- |+ __construct(timestamp : integer) |+ __toString() : string --------------------------------------
Персональный объект ценности:
------------------------------------------------------------- | Person ------------------------------------------------------------- |- name : string |- uri : string |- email : string ------------------------------------------------------------- |+ __construct(name : string, uri : string, email : string) |+ toArray() : array -------------------------------------------------------------
Я рекомендую сериализовать каждый агрегат, начиная с корневого агрегата, в документ JSON. Управляйте доступом к Агрегированным Корням через Репозиторий . Методы toArray () выше возвращают представление ассоциативного массива каждого объекта. Затем репозиторий может преобразовать массив в JSON для хранения в CouchDB. Давайте посмотрим на EntryRepository:
--------------------------------- | EntryRepository --------------------------------- | --------------------------------- |+ get(id : string) : Entry |+ post(entry : Entry) : void |+ put(entry : Entry) : void |+ delete(entry : Entry) : void ---------------------------------
Вот пример того, как может выглядеть граф объектов Агрегата, сериализованный как документ JSON:
{ "_id": "http://bradley-holt.com/?p=1251", "title": { "type": "text", "text": "CouchDB and Domain-Driven Design" }, "updated": "2011-08-02T15:30:00+00:00", "authors": [ { "name": "Bradley Holt", "uri": "http://bradley-holt.com/", "email": "[email protected]" } ], "content": { "type": "html", "text": "<p>I've found CouchDB to be a great fit for…</p>" } }
Вы также можете предоставить доступ к представлениям CouchDB через репозитории. В приведенном выше примере это может быть сделано путем добавления метода index (skip: integer, limit: integer): Entry [*] к EntryRepository (обратите внимание, что это наивная реализация разбиения на страницы, особенно для больших наборов данных, но это выходит за рамки этого сообщения в блоге). Для более сложных представлений вы можете создать отдельный репозиторий для каждого представления CouchDB.
Источник: http://bradley-holt.com/2011/08/couchdb-and-domain-driven-design/