【问题标题】:database with array-like support?具有类数组支持的数据库?
【发布时间】:2015-01-21 12:13:51
【问题描述】:

所以我有一些信息要存储,让我们把它简化为食物来创建一个例子。 一个食谱包含一种或多种成分,每种成分也有一个数量。

所以一个菜谱(一个叫做菜谱的表中的一行)可以包含: id : 0 name : something disgusting ingredientid1 : 0 ingredientamount1 : 20 ingredientid2 : 1 ingredientamount2: 6 ..etc

到目前为止我只对mysql有经验,但我愿意学习。本质上,我可以将成分序列化为一个字符串并存储该字符串,然后使用 LIKE 运算符查找所有具有特定成分的食谱......但我会对这样的解决方案感到厌恶。

目标是让最终用户能够向服务器提供一份成分列表,以获取返回的食谱列表,这些食谱可以使用这些成分制作。

如果不使用 LIKE 运算符,我将如何做这样的事情?

【问题讨论】:

  • 数组可能不是建模这种关系的正确方法。我会将其标准化为food 表、ingredient 表和food_ingredient_map 表。
  • 你可以试试nosql
  • @Brandon food_ingredient_map 听起来很有趣,但你能详细说明一下吗?
  • @RajibGhosh:或使用带有键/值存储 (hstore) 或 json 的 Postgres。 Postgres 开始成为 NoSQL 群体的有力竞争者(因为您可以两全其美)。但是这个问题也可以很容易(有效地)存储在关系模型中。
  • @StephanBijzitter, food_ingredient_map 正是,RecIngr 在我的回答中是什么意思 :)

标签: mysql sql database


【解决方案1】:

您应该将其实现为单独的表:

Recipe('id', 'name'...)
Ingredients('id', 'recipe_id', 'name', 'amount')

然后,您可以通过WHERE recipe_id = x简单地获取所有成分

此外,如果您想与任何食谱分享成分。您应该使用树形表,例如:

Recipe('id', 'name')
Ingredients('id', 'name')
RecIngr('recipe_id', 'ingr_id', 'amount')

然后,你可以通过join获得所有配方成分:

select i.name, ri.amount From Ingredients i
inner join RecIngr ri on ri.ingr_id=i.id
where ri.recipe_id = x

【讨论】:

  • 啊,是的,我本来打算有一个成分表,但是我如何创建一个包含“随机”数量成分的食谱呢?
  • 这是关于业务逻辑,而不是关于数据结构。向数据库插入行时,您可以设置随机/任意数量
  • 啊!编辑让我很清楚!我喜欢这个解决方案,因为它很优雅,也不会用不需要的变量完全膨胀数据库。非常感谢 :) 谢谢@everyone!
猜你喜欢
  • 2019-03-14
  • 2020-02-18
  • 2012-05-20
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2017-10-29
相关资源
最近更新 更多