我有一张桌子,是用来记录各种物品的。在其他属性中,项可以是A、B或C,每个属性都与其他属性互斥。将此信息存储为字符、3组位(isA isB、isC等)或其他方法是最佳实践吗?如果我将来可能需要更多的数据类型,我可以理解使用字符,但是对我来说,使用bit数据类型将消耗更少的存储空间也是有意义的。或者我过度分析了这一点,差异会如此之小以至于无关紧要吗?
发布于 2011-09-27 03:19:40
,还是我过度分析了这一点,差异会如此之小以至于无关紧要吗?
有一点,是的。
但是您必须了解,您的设计方案之间有一个重要的区别:拥有一个char列将使排他性异常工作。拥有IsX字段(单独)将不会。解释:通过使用IsA和IsB列,您可能会在同一条记录中将这两个列都设置为true,除非您使用其他机制来阻止这种情况(触发器、检查约束等)。
此外,每次可能有新值时都有一个新列,这不是一个好的DB设计。
发布于 2011-09-27 03:19:37
只需使用Char即可。
在空间方面,您将在每百万行中使用额外的625kb (假设每行节省5位,这是最好的节省方案)。
不是很多的。
客观地说,这是每十亿行的625 MB。当您遇到这种大小的表时,您不会关心任何不以giga、tera或peta开头的单元。
在内部,SQL Server将它们全部存储为一个字节(最多8位字段)。
当空间变得重要的时候,任何架构的改变(从使用位字段到更灵活的东西)都将是极其痛苦的。
发布于 2011-09-27 03:18:29
我会使用单个字符、字节、枚举等等。如果状态是互斥的,那么这不是标志的最佳用法。
https://stackoverflow.com/questions/7560057
复制相似问题