Требования
- Документы типа
project
всегда имеют отношение только к одному документу типа quotation
.
- Два
projects
не могут иметь отношения к одному и тому же quotation
.
- Два
quotations
не могут иметь отношения к одному и тому же project
- Все документы должны иметь свойство
path
, представляющее собой массив в форме [projectId, ..., entityId]
, которое указывает на иерархические отношения и используется для индексации.
Как лучше всего моделировать отношения между projects
и quotations
?
Вот альтернативы, которые я рассматриваю
Сгенерированный идентификатор
Мотивация: это наиболее похоже на то, что я делал бы в реляционной базе данных.
quotation {
"_id": "quotation:46025df3-f08e-49ff-8fbe-d9afbef116ee",
"path": [
"project:60babbcb-6b5c-48c3-a4e7-3c348887528d",
"quotation:46025df3-f08e-49ff-8fbe-d9afbef116ee"
]
}
project {
"_id": "project:60babbcb-6b5c-48c3-a4e7-3c348887528d",
"quotationId": "quotation:46025df3-f08e-49ff-8fbe-d9afbef116ee",
"path": [
"project:60babbcb-6b5c-48c3-a4e7-3c348887528d"
]
}
Фиксированный идентификатор
Мотивация: Поскольку отношения всегда взаимно однозначные, я не должен думать о них как об отношениях в реляционной базе данных. Это скорее прорыв, характерный для хранилищ документов. Здесь я избегаю добавления создания бесполезного случайного идентификатора и, таким образом, избегаю ненужной сложности
quotation {
"_id": "quotation:project:60babbcb-6b5c-48c3-a4e7-3c348887528d",
"path": [
"project:60babbcb-6b5c-48c3-a4e7-3c348887528d",
"quotation:project:60babbcb-6b5c-48c3-a4e7-3c348887528d"
]
}
project {
"_id": "project:60babbcb-6b5c-48c3-a4e7-3c348887528d",
"path": [
"project:60babbcb-6b5c-48c3-a4e7-3c348887528d"
]
}
Без идентификатора, только путь
Мотивация: Так как у нас есть индексированный путь, мы делаем поиск на основе этого. Нет необходимости в идентификаторе.
quotation {
"path": [
"project:60babbcb-6b5c-48c3-a4e7-3c348887528d",
"quotation:project:60babbcb-6b5c-48c3-a4e7-3c348887528d"
]
}
project {
"_id": "project:60babbcb-6b5c-48c3-a4e7-3c348887528d",
"path": [
"project:60babbcb-6b5c-48c3-a4e7-3c348887528d"
]
}