我需要哪种数据库类型才能找到列表之间的相似性?

时间:2019-08-13 10:03:58

标签: database search

我有一个列表集合。每个列表包含带有标识符和数字值的多个项目。有点像蛋糕食谱。 我想比较所有不同的用户食谱,以找到面粉和糖之间的关系,或者找到鸡蛋的数量和香草精的数量。

我在文档数据库中有JSON格式的食谱。像这样的东西:

[
    {
        "name": "roast",
        "ingredients": [
            { "quantity": "1000", "type": "red Meat" },
            { "quantity": "10", "type": "gravy mix" },
            { "quantity": "10", "type": "dried Italian salad dressing mix" }
            { "quantity": "100", "type": "water" }
        ],
        "steps": [...],
        "score": 4.1
    },
    {
        "name": "plain cookies",
        "ingredients": [
            { "quantity": "400", "type": "flour" },
            { "quantity": "400", "type": "sugar" },
            { "quantity": "2", "type": "eggs" }
            { "quantity": "100", "type": "oil" }
        ],
        "steps": [...],
        "score": 3.1
    },
    {
        "name": "bread",
        "ingredients": [
            { "quantity": "1000", "type": "flour" },
            { "quantity": "50", "type": "sugar" },
            { "quantity": "3", "type": "eggs" }
            { "quantity": "100", "type": "oil" }
        ],
        "steps": [...],
        "score": 4.3
    }
]

示例查询:

  • 用“面粉”和“鸡蛋”找到得分最高的食谱
  • 如果鸡蛋与1000面粉一起使用,哪个数字最受欢迎?

我认为运行查询来比较配方成分不会非常有效。 我需要规范化数据吗?还是图数据库是更好的选择?

1 个答案:

答案 0 :(得分:0)

在某些情况下,结构定义得很好,并且您已经知道执行关系数据库的查询类型似乎是最好的选择。

在上面的示例中,您可以创建2个表:

  • 食谱:

    创建表配方(Id INT主键标识不为空,名称Varchar(256),分数小数(1,1))

  • 成分:

    创建表成分(Id INT主键标识不为空,类型Varchar(256),数量INT不为空,RecipeId INT不为空外部键引用Recipe(Id))

您的查询可以按以下方式执行

  • 使用“面粉”和“鸡蛋”找到得分最高的食谱

    从配方R内联接中选择*配料I ON I.RecipeId = R.Id其中I.Type ='面粉'或I.Type ='蛋'按R.Score描述

  • 1000种面粉中最受欢迎的鸡蛋数量是多少?

    选择数量(数量),从类型为“鸡蛋”和RecipeId中的配料中选择数量(从类型为“面粉”且数量为1000的配料中选择RecipeId),按数量分组,按数量(数量)描述

除了上述内容之外,您还可以添加索引以使查询运行更快。