首页 > 解决方案 > 我应该选择哪个,文档模型或关系模型?

问题描述

在我的应用程序中,我选择了文档模型,但我仍然有一些问题。

这是我的示例文档:

{
  "catalogs": {
    "cat-id1": {
      "name": "catalog-1",
      "createdAt": 123,
      "products": {
        "pro-id1": {
          "name": "product-1",
          "createdAt": 321,
          "ingredients": {}
        },
        "pro-id2": {
          "name": "product-2",
          "createdAt": 654,
          "ingredients": {}
        }
      }
    },
    "cat-id2": {
      "name": "catalog-2",
      "createdAt": 456,
      "products": {
        "pro-id3": {
          "name": "product-3",
          "createdAt": 322,
          "ingredients": {}
        },
        "pro-id4": {
          "name": "product-4",
          "createdAt": 655,
          "ingredients": {}
        }
      }
    }
  }
}

但是产品中的成分是另一个文档的引用者。

{
  "ingredients": {
    "ing-id1": {},
    "ing-id2": {}
  }
}

文档模型有几个好处:

我也知道:

在更新文档时,通常需要重写整个文档。由于这些原因,通常建议您将文档保持在相当小的范围内,并避免增加文档大小的写入操作。

主要思想是:哪种数据模型导致应用程序代码更简单?

我的问题是:

  1. 我应该保留多大的文档?
  2. 我的应用程序已经有一个关系数据库,我应该将文档模型与关系数据库结合起来以降低复杂性吗?

标签: database

解决方案


由于您已经使用了关系数据库,因此我认为使用基于文档的数据库也没有真正的好处。

您的数据库模式似乎很简单,可以使用关系数据库。然而,如果目录条目彼此非常不同,您可以考虑使用基于文档的模型。但情况似乎并非如此。

因此,我的建议是,你坚持使用关系模型。

我会这样设计模型:

  1. 每个实体 ( catalog, product, ingredient) 的表,其中每个条目都有一个唯一的 Id
  2. 每个n:m关系 ( catalogProduct, productIngredient) 的关系表,仅包含关系实体的 Id。

一个例子:

  • 食材ing1ing2ing3存放在餐桌上ingredient
  • 产品prod1prod2存储在product.
  • ing1并且ing2需要prod1
  • ing2并且ing3对于prod2
  • productIngredient每个条目中,您存储成分的 ID 和使用它的产品的 ID。
    • prod1ing1
    • prod1ing2
    • prod2ing2
    • prod2ing3

推荐阅读