У меня есть пример использования планирования человека на какую-то работу в течение некоторого периода времени. Например. Сервис для назначения человека А на работу в интервале времени от X до Z в локации C.
Единственное ограничение, которое у него есть, это то, что один человек не может работать над двумя вещами одновременно. Например. если человек А назначен на работу с 21 июля 2019 г. по 25 июля 2010 г., то человек А не может быть назначен на какую-либо другую работу в это время. Например. Человек А для временного диапазона с 23 июля 2019 г. по 27 июля 2019 г. не должен быть возможен.
Я пытаюсь сделать для него услугу, используя дизайн, управляемый доменом, который назначит человека на какую-то работу. Я думал, что сущность будет выглядеть примерно так:
class Assignment {
PersonId,
startTime,
endTime,
location
}
Теперь я хотел убедиться, что если я найду в своей базе данных запись для человека А в каком-то временном диапазоне, то вызов для создания записи для человека А во временном диапазоне, который перекрывается с существующими, не будет выполнен.
Поскольку я использую модель CQRS с DDD, поэтому я не хочу делать запрос в свою базу данных, запрашивая все назначения для этого человека. Это не всегда могут быть последние данные из-за возможной непротиворечивости модели CQRS. Я знаю, что в моем первичном ключе будет PersonId, но я не уверен, как я могу использовать в нем время начала и окончания.
Любые предложения, что я могу сделать для достижения моей цели для этого? Разве использование DDD и CQRS не является хорошей идеей? Или есть лучший способ смоделировать эту сущность, чтобы я мог достичь своей цели.





Since, I am using CQRS model with DDD, so I don't want to make a query to my database asking for all the assignments for that person.
CQRS — это просто разделение между чтением и записью (команды и запросы). При выполнении команд вы можете запрашивать модель записи.
Если у вас есть назначения в качестве объекта значения агрегата Person, легко проверить, есть ли одновременно более двух назначений. И если назначения должны быть отдельным агрегатом, то агрегат Person должен содержать ссылку на назначения.
Если Задание является Совокупным, вам также может потребоваться убедиться, что Задание назначено только одному человеку. В этом случае может иметь смысл использовать диспетчер процессов или сагу, чтобы гарантировать, что все инварианты поддерживаются, и запускать компенсирующие команды, если это не так.