7

我有一个充满食谱的数据库,每行一个食谱。我需要为每个食谱存储一堆任意“标志”来标记各种属性,例如无麸质、无肉、无红肉、无猪肉、无动物、快速、简单、低脂肪、低糖、低卡路里、低钠和低碳水化合物。用户需要能够通过选中 UI 中的复选框来搜索包含一个或多个这些标志的食谱。

我正在寻找将这些属性存储在“食谱”表中的最佳方式。到目前为止我的想法:

  1. 每个属性都有一个单独的列,并在每个列上创建一个索引。我可能有超过 20 个这些属性,所以我想知道在单个表上创建一大堆 BOOL 列是否有任何缺点。
  2. 对所有属性使用位掩码,并将整个内容存储在一个包含适当位数的数字列中。在每个位上创建一个单独的索引,这样搜索会很快。
  3. 为每个标签创建一个带有值的 ENUM,然后创建一个具有该 ENUM 类型的 ARRAY 的列。我相信数组列上的 ANY 子句可以使用 INDEX,但从未这样做过。
  4. 创建一个单独的表,其中包含配方到标签的一对多映射。每个标签将是该表中的一行。该表将包含一个到配方的链接,以及一个 ENUM 值,该配方的标签为“on”。查询时,我必须执行嵌套 SELECT 以过滤掉至少不包含这些标签之一的食谱。我认为这是更“正常”的做法,但它确实使某些查询更加复杂 - 如果我想查询 100 个食谱并显示它们的所有标签,我必须使用 INNER JOIN 并合并行,或使用嵌套的 SELECT 并即时聚合。

写入性能在这里不是太大的问题,因为食谱是由后端进程添加的,并且搜索速度至关重要(最终可能会有几十万个食谱)。我怀疑我是否会经常添加新标签,但我希望它至少可以在没有大麻烦的情况下完成。

谢谢!

4

1 回答 1

5

我建议您使用标准化设置。我不建议从一开始就将其设置为非规范化结构。

在不知道他所做的所有细节的情况下,我认为最好的设置是拥有你的配方表和新的属性表以及一个新的 recipe_property 表。这允许一个配方具有 0 个或多个属性,并对您的数据进行规范化,从而快速、轻松地维护和查询您的数据。

高级结构将是:

CREATE TABLE recipe(recipe_id);
CREATE TABLE property(property_id);
CREATE TABLE recipe_property(recipe_property_id,recipe_id,property_id);
于 2011-12-05T05:11:41.603 回答