【问题标题】:What's the best way in Postgres to store a bunch of arbitrary boolean values for a row?在 Postgres 中为一行存储一堆任意布尔值的最佳方法是什么?
【发布时间】:2011-12-05 04:08:02
【问题描述】:

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

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

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

这里的写入性能不是太大的问题,因为食谱是由后端进程添加的,而且搜索速度很关键(最终可能会有几十万个食谱)。我怀疑我是否会经常添加新标签,但我希望它至少可以做到不那么令人头疼。

谢谢!

【问题讨论】:

    标签: sql database postgresql postgresql-9.1


    【解决方案1】:

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

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

    高级结构是:

    CREATE TABLE recipe(recipe_id);
    CREATE TABLE property(property_id);
    CREATE TABLE recipe_property(recipe_property_id,recipe_id,property_id);
    

    【讨论】:

    • 是的,这绝对是一条路线。我也在考虑使用ENUM 而不是property_id,并且没有property 表。不过,在数据库内部,它与您拥有的相同。
    • 只要确保您的最终解决方案不会让您陷入困境。
    • 在得到许多专家的相同建议后,我最终选择了标准化路线。但是,我确实简要地研究了 Postgres 的 hstore 模块,它非常棒;但是我选择不在这种特殊情况下使用它。
    • 我发现一般来说,解决方案越直接越好,而且我不是在谈论使用胶带方法。在我的生活中,我曾无数次因为代码以过于聪明的方式编写的混乱而受害。作为回报,您必须过度思考才能了解正在发生的事情。当你必须保持这种类型的东西时,它会让你想换职业。
    猜你喜欢
    • 2021-09-27
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2014-04-11
    • 2011-10-03
    相关资源
    最近更新 更多