【问题标题】:Is better have a boolean (important flag )like an attribute or in a separate table?最好有一个布尔值(重要标志),如属性或单独的表?
【发布时间】:2011-07-16 20:31:12
【问题描述】:

我有三种情况,我不知道每种情况有什么更好的解决方案,但都是关于布尔属性的

  • 我有一个链接表,每个链接都有属性来确定是否被访问、损坏或过滤,并且每个链接的值必须更新一次(除了极少数情况下重置所有链接)。

  • 上面的相同链接有一个不断更新的访问属性,但在超过 100 万行的表中,最多 10,000 或 20,000 为 true。

  • 我有一个包含页面的表格和一个属性来指示是否每个页面都已处理。最后(处理后),所有行都必须为真。

我想知道每种情况下哪种更好的解决方案。

我认为是:第一种情况是属性,第二种情况是表,第三种情况我不知道。

欢迎使用其他解决方案(例如 index,也许)。

重要提示:两个表(页面和链接)都可以有超过一百万行。

【问题讨论】:

  • 很难说出你在@Renato 真正问的是什么。这三个要点是构建数据库模式的三种可能方式吗?第一个项目符号似乎将“链接”描述为具有三个状态,第二个和第三个项目似乎将一个链接描述为只有两个状态,因此您在每种情况下都不是表示相同的数据?
  • 事实上,如果你将这三种情况分成不同的问题,也许你会做得更好,因为它们似乎都在询问在不同情况下什么是最有效的。拆分可以帮助您更清楚地解释每一个,最好使用一些示例 SQL 来创建您描述的表。
  • 链接有四种状态,第一项中描述的三种,第二项中描述的第四种,第三项是关于另一个表中具有另一个属性的页面。

标签: sql database performance postgresql


【解决方案1】:

我会说第一种情况的列,第二种情况的表格和第三种情况的列。

根据数据库的规模,您的主要关注点可能是将经常更新的数据与其他大部分数据分开。这就是为什么我会为第二种情况建议一张桌子。但是,您可以明智地使用 PostgreSQL 的“HOT”特性,这意味着如果正在更新的列没有被索引,则更新不会导致表膨胀。但是,让流量远离大型表可能仍然是一个好主意,因为可能会花费大量的搜索时间,保持 autovacuum 快乐等。如果您担心,我会对此进行测试。

【讨论】:

    【解决方案2】:

    没有“最好”的方法。了解您的方法是否足够高效的唯一方法是进行并查看。一种持续更新的方法在读取量大而更新量少的情况下会执行不同的方法。

    我建议将所有内容都放在桌面上,除非您有理由不这样做并试一试。

    但最重要的是:什么 DBMS

    【讨论】:

    • 添加标签,是PostgreSQL
    猜你喜欢
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2021-10-10
    • 2014-05-23
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多