我有一个充满食谱的数据库,每行一个食谱。我需要为每个食谱存储一堆任意“标志”来标记各种属性,例如无麸质、无肉、无红肉、无猪肉、无动物、快速、简单、低脂肪、低糖、低卡路里、低钠和低碳水化合物。用户需要能够通过选中 UI 中的复选框来搜索包含一个或多个这些标志的食谱。
我正在寻找将这些属性存储在“食谱”表中的最佳方式。到目前为止我的想法:
- 每个属性都有一个单独的列,并在每个列上创建一个索引。我可能有超过 20 个这些属性,所以我想知道在单个表上创建一大堆 BOOL 列是否有任何缺点。
- 对所有属性使用位掩码,并将整个内容存储在一个包含适当位数的数字列中。在每个位上创建一个单独的索引,这样搜索会很快。
- 为每个标签创建一个带有值的 ENUM,然后创建一个具有该 ENUM 类型的 ARRAY 的列。我相信数组列上的 ANY 子句可以使用 INDEX,但从未这样做过。
- 创建一个单独的表,其中包含配方到标签的一对多映射。每个标签将是该表中的一行。该表将包含一个到配方的链接,以及一个 ENUM 值,该配方的标签为“on”。查询时,我必须执行嵌套 SELECT 以过滤掉至少不包含这些标签之一的食谱。我认为这是更“正常”的做法,但它确实使某些查询更加复杂 - 如果我想查询 100 个食谱并显示它们的所有标签,我必须使用 INNER JOIN 并合并行,或使用嵌套的 SELECT 并即时聚合。
写入性能在这里不是太大的问题,因为食谱是由后端进程添加的,并且搜索速度至关重要(最终可能会有几十万个食谱)。我怀疑我是否会经常添加新标签,但我希望它至少可以在没有大麻烦的情况下完成。
谢谢!