我有一张桌子可以跟踪各种物品。在其他属性中,项目可以是A,B或C,每个都与其余项目互斥。最好的做法是将这些信息存储为一个字符,还是三组位(isA是B,isC等),还是其他一些方法?如果我将来可能需要更多数据类型,我可以理解使用该字符,但是对我来说使用位数据类型会消耗更少的存储空间也是有意义的。或者我是否过度分析了这一点,差异是否会微不足道甚至不重要?
答案 0 :(得分:4)
或者我是否过度分析了这一点,差异是否会微不足道甚至不重要?
一点点,是的。
但是您必须明白,您的设计建议之间存在重大差异:拥有char
列会使排他性异常工作。拥有IsX
个字段(单独)不会。解释:通过使用IsA
和IsB
列,您可以在同一记录中设置为true,除非您使用其他机制来阻止(触发,检查约束等)< / p>
此外,每次有新值时都有一个新列不是好的数据库设计。
答案 1 :(得分:2)
只需使用Char
。
在空间方面,您将使用额外的625kb /百万行(假设每行节省5位,这是节省成本的最佳情况)。
这不是很多。
从透视角度来看,每 BILLION 行625 MB
。当您到达那个大小的表格时,您并不关心任何不以giga
,tera
或peta
开头的单位。
在内部,SQL Server将它们全部存储为一个字节(最多8位字段)。
当空间重要时,任何架构的变化(从使用位域到更灵活的东西)都将非常痛苦。
答案 2 :(得分:1)
我会使用一个char,byte,enum等等。如果状态是互斥的,那么这不是标志的最佳用途。
答案 3 :(得分:1)
认为这是一个非常紧张的,但有点疯狂的方式来消除你的情景将是将它们存储在一个可以为空的位。
“可以取值为1,0或NULL的整数数据类型。”
但是我不知道他们是怎么做到的,因为
“SQL Server数据库引擎优化了位列的存储。如果表中有8位或更少位列,则列存储为1个字节。”
来自http://msdn.microsoft.com/en-us/library/ms177603.aspx
如果您需要对三个值建立索引,我会选择tinyint而不是三位字段。
答案 4 :(得分:0)
我使用的是tiny int,基本上是0到255之间的一个字节。当您扩展可能的值时,您最终会使用疯狂的字母而不是任何意义。所以,我只是从数字开始。保持这三个位相互排斥是不值得的麻烦,他们将采取一个字节的存储。