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

Database 如何为许多不同的数据库标志设计模式,database,database-design,Database,Database Design,我有一个表,有可能有很多不同的标志。处理这个问题的最佳方法是什么 以下是我提出的选择 多个多对多表,主表中保留一些标志 一个通用的多对多表,称为TableAttributes或flags,用于所有表标志。更多的处理留在代码中 桌子上的每一样东西都是一面旗帜(导致巨大的桌子) 其他想法???我过去使用的一种方法是利用位图。这些可以作为简单整数或大整数列建模到表中。然后,您就可以灵活地更改和强制通过代码使用的标志,而无需更改数据库模型 例如,2的简单幂值是您的标志:1、2、4、8和16 select

我有一个表,有可能有很多不同的标志。处理这个问题的最佳方法是什么

以下是我提出的选择

  • 多个多对多表,主表中保留一些标志
  • 一个通用的多对多表,称为TableAttributes或flags,用于所有表标志。更多的处理留在代码中
  • 桌子上的每一样东西都是一面旗帜(导致巨大的桌子)

  • 其他想法???

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

    例如,2的简单幂值是您的标志:1、2、4、8和16

    select 1 | 2 | 4 | 8 | 16
    Result: 31
    
    当所有5个标志都处于活动状态时,您的标志列将只存储值31。您可以使用位和检查标志是否处于活动状态:

    select 1 where 31 & 4 = 4
    Result: 1
    
    在这种情况下,我们知道位4的标志处于活动状态。在SQL代码中使用位图很容易,当然在客户端应用程序中也很容易,在客户端应用程序中,逐位数学是该语言不可分割的一部分。位图可以在枚举中编码,并在客户端代码中轻松引用,并使用常量存储过程。

    两个问题:

    • 旗帜是预定的吗
    • 你需要搜索它们吗
    假设标志不是预先确定的,您将需要如下内容:

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

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

    另一方面,如果您还想(有效地)回答以下问题:“给定一个标志,它设置了哪些项目?”,您应该在
    {flag\u NAME}
    上添加索引,或者可能在
    {flag\u NAME,ITEM\u ID}
    上添加索引


    如果所有标志都是预先确定的,只需将每个标志表示为一个单独的列即可。索引您需要搜索的对象,如果您的数据库支持,可以使用位图索引,并且修改性能要求允许


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

    就个人而言,如果需要这些标记的表的总数很小(如小于10),我会倾向于选项#1(主表中没有任何标记的情况除外)。除此之外,我会选择选项2。我见过这种方法,我不喜欢它的一点是,如果不运行按位样式,很难计算出表中的数据query@chobo使用将位图规范化为列的视图覆盖表非常容易,但是,除了创建它的DBA之外,很少有人在查看原始表数据,所以您说将它们建模为整数,然后在代码中使用位数学检查标志。这难道不意味着您必须将较大的数据集加载到内存中,然后对其进行过滤吗?似乎效率低下。我喜欢这样的按位方法,但我认为更好的问题是是否有一个数据库支持按位数学本机,而且TSQL似乎可能!我想知道它的表现有多好。。。