Лучший способ смоделировать отношения между родительским документом и одним разделенным дочерним документом? - PullRequest
0 голосов
/ 10 мая 2019

Требования

  • Документы типа 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"
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...