Должна ли у вас быть единая база данных для всех правил или отдельная база данных для каждого ограниченного контекста?

В DDD, насколько я понимаю, он помогает или помогает вам структурировать сложные приложения. Теперь в приложении вы должны определить свой ограниченный контекст. Скажем, у вас есть более 10 лет до нашей эры.

Я где-то читал (извините, я не могу дать никаких ссылок), что не идеально иметь одну большую базу данных для сложного приложения. Это должно быть отделено для каждого BC. Если это более легкий путь. Как следует структурировать приложение, если каждая БК имеет свою собственную базу данных.

Я пытался искать на GitHub, но не могу найти.

3 ответа

Это зависит от того, разделяют ли они одну и ту же базу данных или несколько таблиц - т.е. данные.

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

Я вижу еще несколько недостатков таблиц базы данных, совместно используемых двумя или более ограниченными контекстами:

  • Тесная связь. Причина, по которой у нас есть разные BC, состоит в том, что они представляют разные доменные пространства, которые могут расходиться по-своему. Изменение концепции в одном из BC может повлиять на базовую таблицу, заставив другие BC, которые также используют эту таблицу, измениться. Вы получаете жесткость там, где должна быть гибкость. У вас также могут быть несоответствия или "дыры" в данных из-за множества возможных источников изменений.

  • Параллелизм. В высококонкурентных системах некоторые сущности и таблицы под ними подвергаются сильной конкуренции. Ограниченный контекст является одним из способов облегчить нагрузку, разделяя различные типы записей, но это работает только в том случае, если они не блокируют одни и те же данные в конце дня. То же самое верно для операций чтения в системах, отличных от CQRS, где они запрашивают ту же базу данных, где выполняются записи.

  • ORM дружелюбие. Большинство ORM не позволяют отображать 2 или более классов из одной таблицы базы данных без большого количества сверток и обходных путей.

Как следует структурировать приложение, если каждая БК имеет свою собственную базу данных.

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

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

Если у вас есть Заказчик в двух разных БЦ, это вызывает своего рода актерскую ситуацию. Если центр поддержки должен знать о новом клиенте при его создании в центре продаж, то центр продаж должен подключиться к известному интерфейсу в центре поддержки и передать ему эту новую информацию. Один домен разговаривает с другим. Он довольно точно моделирует, как все работает в реальной жизни, когда люди из разных отделов общаются друг с другом.

Если вы разделяете большую базу данных (вы говорите о заказном корпоративном программном обеспечении здесь, так что примеров не будет много в дикой природе), тогда возникает соблазн обойти весь опыт предметной области, накопленный на доменных уровнях, и вмешаться в базу данных другого BC., Все очень быстро превращается в большой шарик грязи.

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

Это зависит от причины, по которой они являются собственной базой данных. Идея ограниченного контекста состоит в том, что у вас есть набор сущностей, которые связаны друг с другом и решают проблему вместе. Если вы посмотрите на ссылку Хаима Элайи, вы можете получить информацию о продажах и о поддержке. http://martinfowler.com/bliki/BoundedContext.html

Теперь нет причин, по которым продукт для продажи, и продукт для поддержки должен выглядеть одинаково в базе данных. Важно то, что если служба поддержки хочет добавить свойство (например, "Низкое качество"), оно может сделать это, пока продажи не захотят этого свойства. Также время простоя в вашем приложении для продаж, вероятно, не должно влиять на ваше приложение поддержки.

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

Тем не менее, отделитесь, если можете. Если это невозможно, попробуйте определить права собственности. Вы делаете вашу жизнь намного проще, если все согласны с тем, что продукт - это продукт, определяемый продажами, и что поддержка может иметь "productfactsheetTable", дополняющую продукт. Таким образом вы избежите противоречивых изменений в каждом ограниченном контексте. (также следует, что поддержка может только читать продукты, но никогда не писать). Табличные префиксы могут помочь здесь прояснить это.

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

Другие вопросы по тегам