如何正确设计使用MongoDB的配方/配料的数据模型

问题描述 投票:0回答:1

最近我设计了一个数据库模型或使用Hackalode ERD。所以我目前所面临的问题是我目前的设计基础上,我不能正确,因为我想查询。我学的ERD与MySQL和知道,蒙戈不起作用相同

这个想法很简单,我想有成分的数组列表配方和成分是从单独收集。配方还包括该成分即测量的。 (1 TBPS糖)

也可以从配料表查询,发现含有的成分配方

我想这个藏品是在多对多的关系和配方可使用的数据库中已有的成分。

Current design of data model

我只是不知道如何查询数据

我以$ elemMatch和填充尝试了很多办法,所有我得到的是空数组列表作为结果。

林期待两种类型的查询,我可以通过配料的名称或配方查询

我预计结果会是这样

[{
   id: ...,
   name: ....,
   description: ...,
   macros: [...],
   ingredients: [
   {
       id,
       amount: ....,
       unit: ....
       ingredient: {
           id: ....,
           name: ....
       }
   }
}, { ... }]

但是,而不是领

[]
database mongodb mongodb-query many-to-many erd
1个回答
1
投票

恕我直言,你的设计是完全错误的。您在标准化您的数据。我会做更简单的东西,使用嵌入。背后的理由是,首先要定义你的使用情况,然后你模拟你的数据来回答的最有效的方式从你的用例中出现的问题。

Assumed use cases

  1. 作为一个用户,我希望所有的配方列表。
  2. 作为一个用户,我想所有成分的配方列表。
  3. 作为一个设计师,我希望能够表现出所有成分的列表。
  4. 作为一个用户,我希望能够链接到食谱复合成分,它应该是出现在网站上。

当然,这只是一个小片段,但它是足够的例子。

How to answer the questions

上,第一个是非常简单的:

db.recipes.find()[.limit()[.skip()]]

现在,我们怎么能找到的成分?答案很简单:做配料名称的文本索引(也可能是其他一些领域,as you can only have one text index per collection随后,查询同样很简单:

db.recipes.find({$text:{$search:"ingredient name"}})

“嘿,稍等片刻!我如何获得所有成分的列表?”让我们假设我们要成分的简单列表,以及它们是如何往往实际使用的数字:

db.recipes.aggregate([
  // We want all ingredients as single values
  {$unwind:"$Ingredients"},
  // We want the response to be "Ingredient"
  {$project:{_id:0,"Ingredient":"$Ingredients.Name"}
  // We count the occurrence of each ingredient
  // in the recipes
  {$group:{_id:"$Ingredient",count:{$sum:1}}}
])

这实际上是足够的,除非你有食谱gazillions的数据库。在这种情况下,你可能希望有一个深入探讨incremental map/reduce而不是聚集。提示:你应该添加一个时间戳的食谱能够使用增量的map / reduce。

如果你有一对夫妇几百K到几百万的食谱,你还可以添加qazxsw邮资预汇总数据。

在测量

恕我直言,这是没有意义的有定义的测量。有茶匙,汤匙,公制和英制测量,分组像“打”或规范,如“丁香”。你真的不想要转换成对方,甚至设置为测量值的数量有限。有多少盎司是一瓣大蒜? ;)

底线:使它成为一个自由文本字段,可能与部分自动完成建议。

Revised data model

食谱

$out

和文本索引的例子:

{
  _id: new ObjectId(),
  Name: "Surf & Turf Kebap",
  Ingredients: [
    {
      Name: "Flunk Steak",
      Measurement: "200 g"
    },
    { 
      Name: "Prawns",
      Measurement: "300g",
      Note: "Fresh ones!"
    },
    {
      Name: "Garlic Oil",
      Measurement: "1 Tablespoon",
      Link: "/recipes/5c2cc4acd98df737db7c5401"
    }
  ]
}

The theory behind it

配方是你的基本的数据结构,为您的应用程序应该是存储和提供它们,可能基于一定的标准。成分和测量(到延伸在有意义)可以容易地从食谱的。那么为什么还要单独存储的成分和测量。它只会让你的数据模型过于复杂,同时不提供任何好处。

心连心

© www.soinside.com 2019 - 2024. All rights reserved.