小编roc*_*oco的帖子

除了添加大量列之外,是否有用于存储许多布尔标志的通用模式?

我有一堆需要与用户帐户关联的布尔值。它们需要在真假之间切换,尽管不是特别频繁——它们被阅读的次数将比写入的次数更多。大多数情况下,它们只会从 False 设置为 True 一次,但情况并非总是如此。

现在我正在考虑将列附加到用户表中:

用户身份 other_user_cols did_a did_b did_c
1 ... 错误的 真的 错误的
2 ... 错误的 错误的 错误的
3 ... 真的 错误的 错误的

问题是,有很多这样的布尔列。

假设您需要添加 100 列。这真的仍然是最好的方法吗?

认为:

  • 它不会非常稀疏 - 大多数用户会在某个时候切换大多数布尔值
  • 布尔值没有以自然可以更好地组织的方式在逻辑上相关
  • 可能需要不时添加新的
  • 标志直接与每个用户相关联,除了单个布尔值之外不需要其他信息

我觉得这一定是一个非常常见的模式,但是这种将更多布尔列塞入我的表的方式似乎相当混乱。有没有更典型的方法来做它更干净一点?或者这实际上是最好的方法?

为此,我正在使用 Postgres。

以下是我考虑过的一些替代方案:

  • 序列化为字符串的 json 列表(= 列名)。这听起来比原来的更混乱,如果我想对数据进行任何严肃的 SQL 操作,也不理想
  • 使用数字和按位运算 - 不确定这有多受支持,以及需要对单个标志进行操作/查找的类似问题
  • 有一个单独的表,如:
用户身份 标志名称 价值
1 did_a 错误的
1 did_b 错误的
3 did_a 真的

作为替代方案,这对我来说似乎是最合理的,但不确定是否真的值得麻烦,或者是否有更好的方法。

postgresql database-design

19
推荐指数
3
解决办法
2401
查看次数

具有主键和外键的查询是否比仅具有主键的查询运行得更快?

SELECT something FROM table WHERE primary_key = ?
Run Code Online (Sandbox Code Playgroud)

对比

SELECT something FROM table WHERE primary_key = ? AND other_key = ?
Run Code Online (Sandbox Code Playgroud)

假设这是一个包含other_key不会改变结果集的场景。在实践中第二个查询更快吗?或者,如果提供了多个,数据库是否只使用一个最佳密钥?

postgresql performance optimization query-performance

5
推荐指数
1
解决办法
3053
查看次数