我有一个列表集合。每个列表包含带有标识符和数字值的多个项目。有点像蛋糕食谱。 我想比较所有不同的用户食谱,以找到面粉和糖之间的关系,或者找到鸡蛋的数量和香草精的数量。
我在文档数据库中有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
}
]
示例查询:
我认为运行查询来比较配方成分不会非常有效。 我需要规范化数据吗?还是图数据库是更好的选择?
答案 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),按数量分组,按数量(数量)描述
除了上述内容之外,您还可以添加索引以使查询运行更快。