Для отношений «многие ко многим» мы рекомендуем использовать два контейнера и использовать «Изменить канал», чтобы синхронизировать данные между ними c. Однако вы бы сделали это только в том случае, если вы выполняете большие объемы операций чтения и записи как для отделов, так и для сотрудников. Здесь видно, что подразделение организации почти устарело c, и сотрудники часто меняются. Так что все зависит от того, как вы получаете доступ к данным, и вам следует поэкспериментировать, чтобы определить, какая стратегия является наиболее эффективной моделью и ключом раздела.
Контейнер отдела будет иметь идентификатор отдела в качестве ключа раздела с новым документом для каждого сотрудника. Я не стал бы встраивать сотрудников в документ отдела, поскольку он может достигать максимального размера до c размером 2 МБ. Также, если вы часто обновляете отдел с небольшими изменениями в сотрудниках, это будет дорого.
Я бы смоделировал данные в контейнере отдела следующим образом.
{
deptId:101,
deptName: "XXX",
type: "department"
}
{
empId: 101,
empName:"AAA",
deptId: 101,
type: "employee"
}
Чтобы получить всех сотрудников для отдела, вы должны написать запрос следующим образом.
Select * FROM c WHERE c.deptId = 101
This вернул бы и отчет отдела и всех его сотрудников. Читая набор результатов в своем коде, вы проверяете свойство «type» и десериализуетесь в правильный тип класса.
На стороне Сотрудника вы делаете противоположное. Ключом вашего раздела будет employeeId, и он будет иметь такую модель.
{
empId: 101,
empName:"AAA",
deptId: 101
}
Обновления идентификатора отдела будут выполняться только для контейнера сотрудников. Используя ленту изменений, вы прослушиваете изменения и затем выполняете вставку в контейнер департаментов, чтобы сохранить их в синхронизации c (именно так вы делаете ссылочную целостность в базе данных No SQL).
Есть много отличных документов о том, как моделировать и разбивать ваши данные в Cosmos DB. Я определенно прочитал бы их, чтобы понять, как лучше проектировать для Космоса.
Данные модели
Данные раздела
Пример из реального мира
Надеюсь, это поможет.