代码之家  ›  专栏  ›  技术社区  ›  Nathan W

在表中存储大量布尔列的最佳方法

  •  2
  • Nathan W  · 技术社区  · 15 年前

    我不确定以前是否有人问过这种问题,但我搜索了一下,发现了什么。

    我目前正在处理一个数据库,其中包含存储了大量基于布尔值的记录,因此表结构如下所示:

    ===Table===
    ID <- int
    Name <- string
    Bool1 <- bool
    Bool2 <- bool
    Bool3 <- bool
    Bool4 <- bool
    Bool5 <- bool
    Bool6 <- bool
    Bool7 <- bool
    Bool8 <- bool
    Bool9 <- bool
    

    我想过做这样的事:

    ==Main Table==     ===Second Table====
    ID <- int PK          ValueID <- PK links to Main Table ValueID
    Name <- string        ID <- int
    ValueID <- FK         Value <- Contains name of assigned value eg Bool1, Bool2
    

    我考虑这样做的原因是它允许我在将来针对记录添加不同的存储值,而不是更改表结构。

    这是存储大量布尔值的好方法吗?

    我真的很想能够把这个绑定到一个带有复选框的窗体上 走这条路会很难。

    所以,如果这有点难以理解我需要什么,我真的不知道如何在文本中解释它。

    谢谢。

    3 回复  |  直到 15 年前
        1
  •  15
  •   Matt Howells    15 年前

    别管它了!

    数据库将非常有效地打包多个位字段。我见过有人这样做,比如有一个32位的int字段,这样就允许他们使用位掩码存储17个布尔值,并“为其他字段留出一些空间”。这是愚蠢的,这是一个维护的噩梦,你的查询变得乱七八糟的位掩码,使他们难以维护。

        2
  •  0
  •   GrGr    15 年前

    不要将FK(ValueID)放入主表,而是将MainID放入第二个表。

    从你的问题中不清楚的一些事情:如果一个值没有被设置,这是否等同于一个假值,或者你有三元逻辑的空值?如果是后者,则必须在第二个表中放入一个布尔字段。否则,第二个表中没有记录就足以给出逻辑错误。

        3
  •  -1
  •   Mike Chaliy    15 年前

    只是一个想法,你可以使用int来存储位,按位操作是有效的,但是我不知道SQL支持它们有多好。在C#中有位枚举,因此可以直接保存它的值。