Статьи

CouchDB отлично подходит для доменного дизайна

Я обнаружил, что 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/