在SQL数据库中有效地存储小的固定长度数组

时间:2013-12-19 03:46:14

标签: database database-design

我希望有更多数据库经验的人可以告诉我。

我正在试图找出存储5位1位值数组的最佳方法。这只提供了32种不同的组合。

如果我将其存储在5列中,则每个用户需要5个字节。鉴于它只有5位数据 - 而且浪费了35位,这“感觉很糟糕”。

另一种选择是使用查找表并为每个用户存储单个字节引用。这种“感觉很糟糕”,因为它会使查询变得不必要地复杂和缓慢。

我能想到的唯一另一个选择是序列化值,然后每个操作都需要开销,并打破第一个正常顺序的规则。

或者,也许有一个更好的数据库我应该使用它允许更精细的谷物控制将存储在其中的INTEGER的大小?我目前正在使用SQLite。

P.S。 - 这是一个例子,但我实际上有许多其他类似的数组要存储,所以它并不像每个用户吸收35个浪费的数据那么简单。

1 个答案:

答案 0 :(得分:0)

  

为了理解这一点,你必须自己刷新十进制数字的二进制表示以及Bit-Wise Operators和Bit Shifting。每种特定的编程语言都有不同的“按位AND”和“位移”运算符。请参考您用于Proper Bit Operators的编程语言。 “按位与”运算符允许您通过对每个位执行逻辑二进制AND运算来确定某个位位置是1还是0。

     

此处记录的SQLite数据类型http://www.sqlite.org/datatype3.html支持以下“动态类型”

  1. NULL - 值为NULL
  2. INTEGER - 值为有符号整数,存储在1,2,3,4,6,8字节中,具体取决于值
  3. REAL - 该值是一个浮点,为8字节IEEE浮点数
  4. TEXT - 值为文本字符串
  5. BLOB - 值是一团数据
  6.   

    计算机上的所有内容只是一系列二进制1和0,通常最小的分配是8位等于1字节。你如何解释那些1和0是真的由你决定。所以8位可以是一个INTEGER,如果你想要它或者它可以是一个CHARACTER或任何真正的......下面我将提出你将5位存储到1个字节并将其解释为5个值的方法1或0作为值,或者如您所述的X位数,可以在尽可能最小的分配大小中“开启”或“关闭”。

         

    在您只使用5位并且希望最小化存储要求的情况下,可以将其存储为1字节(8位)整数值(这是SQLite允许的最小数据结构,它没有然后使用“位掩码”或“移位位”的组合来检索5个位置中的每个位置的值或使用“逐位AND”操作。例如,您可以表示5位结构(每个1位的长度为5的数组),其中3个前导零,其中5个最右位具有含义(3位+5位= 8位= 1个字节)。例如00011111,00010101,00010000 ...(通知最左边的3位是零)。

         

    请记住,1字节(8位)整数是二进制的11111111或255十进制。在某些语言中,这被称为TinyInt或SmallInt。在您的情况下,如果您只使用低5位,那么剩余的高3位应始终为000。

         

    例如,如果我的值是00011111二进制,等于31十进制。因此,如果我想知道第一个比特值,我会用00000001“按位”它,如果我想知道第二个位置,我将按00和00000010,第三个位置将是00000100,第四个位置00001000和第五个00010000。表示每个位置的这些特定二进制值称为“位掩码”。

         

    “按位AND”运算符的工作方式是,如果我有一个值,并且我“BitWise AND”它与正确位置“Bitmask”并且它等于“BitMask”值,则该Bit已设置。例如,如果我的值是00010010二进制(18十进制)并且我想知道第二个位置位是否设置(等于1)那么我使用BitMask 00000010.如果00010010“BitWise AND”与00000010 = 00000010那么设置第2位,否则不设置。如果我想找到第5个位置位是否设置,那么我会用00010000进行00010010“按位与”,如果等于00010000则设置第5位(即第5位等于1),否则为第5位未设置(意味着第5位为0)。

    请记住,我在二进制文件中解释这一点,但数据类型是一个Integer,所以在SQLite DB中可视化,你会看到它是一个十进制值,但由于计算机上的所有内容只是一个Bits流,你将使用位操作在该数据类型上运行。