如何为许多不同的数据库标志设计模式

时间:2012-02-15 22:43:02

标签: database database-design

我有一张桌子,有可能有很多不同的旗帜。处理这个问题的最佳方法是什么?

以下是我提出的选项

  1. 多个多对多表,主表中还留有一些标记
  2. 一个名为TableAttributes的通用多对多表或用于所有表标志的标志。更多的处理留在代码
  3. 表格中的所有东西(通向巨型桌子)
  4. 其他想法???

2 个答案:

答案 0 :(得分:1)

我过去使用的方法是利用位图。这些可以作为简单的Integer或Big Integer列建模到表中。然后,您可以灵活地更改和强制执行通过代码使用的标志,而无需更改数据库模型。

例如,2个值的简单幂就是你的标志:1,2,4,8和16

select 1 | 2 | 4 | 8 | 16
Result: 31

当所有5个标志都处于活动状态时,您的标志列将只存储值31。您可以使用bitand检查标志是否处于活动状态:

select 1 where 31 & 4 = 4
Result: 1

在这种情况下,我们知道第4位的标志是活动的。在SQL代码中使用位图很容易,当然也可以在客户端应用程序中使用,其中按位数学是语言不可或缺的一部分。位图可以在枚举中编码,并在客户端代码中轻松引用,并使用常量存储过程。

答案 1 :(得分:1)

两个问题:

  • 标志是预定的
  • 你需要搜索吗?

假设标志预定,你需要这样的东西:

enter image description here

如果FLAG表中存在相应的行,则该标志为给定项的“set”,如果该行不存在则为“reset”。如果您需要区分“NULL”和“重置”,则可以添加FLAG_VALUE字段。

这个结构有效地回答了以下问题:“给定一个项目,它有哪些标志?”。如果这就是您所需要的,那么您可以避免使用二级索引并创建表clustered(在Oracle中也称为“索引组织”)。

另一方面,如果你也想(有效地)回答这个问题:“给定一个标志,哪些项目设置好了?”,你应该在{{1}上添加一个索引} {或者{FLAG_NAME} {FLAG_NAME, ITEM_ID}上的covering index(遗憾的是,群集不太理想)。


如果预定所有标志 ,则只需将每个标志表示为单独的列。索引您需要搜索的内容,如果您的数据库支持,可能使用位图索引,并且修改性能要求允许它。

您可以使用位图将标记更紧密地打包在不能有效表示布尔值的数据库(例如Oracle)上,并可能使用function-based indexes