我的团队中有一些成员正在考虑让数据库中的每一列都是包含数字列的字符串。
我知道排序成了一个问题,数据完整性成了问题,性能成了问题。
将数字列作为字符串只是为了启发,这样我就可以与团队成员分享,还有什么缺点呢?
主要问题是用户可以将损坏的数据放入列中——这些数据不是数字。这在正确的类型下是不可能的。尽管您可以为每个数字列添加一个检查约束,但这似乎需要做很多工作。
场景是:您有一个有效的查询,并且已经运行了很长时间。突然间,有人在列中放入了一个非数字值。查询中断。由于查询(可能(使用了隐式转换,因此很难判断问题出在哪里
我只想说:我是凭经验说话的。
其他问题包括:
- 比较无法按预期工作:
'0' <> '0.0'
- 比较没有按预期工作:
'9' > '100'
- 比较没有按预期工作:
'.1' < '0.01'
- 排序无法按预期工作
- 代码中充满了(不必要的,通常是隐式的(转换
- 某些数据库(如SQL Server(会重载运算符,因此
'1' + '1' <> '2'
- 某些数据库重载运算符,因此
current_timestamp + 1
有效,但current_timestamp + '1'
无效 - 查询中的比较可能会影响索引的使用。因此,
strcol = 1
最终将strcol
转换为一个数字,这通常排除了索引的使用。另一方面,intcol = '1'
最终将常数转换为数字,这仍然允许使用索引不过,我不建议在比较中混合类型
空格是一种洗白,因为在许多情况下,字符串表示可能小于数字表示。这取决于这种情况。由于固定长度的键通常更有效,因此索引会受到轻微影响。
如果混合类型,情况会变得更糟——因为这会影响优化器。
有些由数字组成的东西不一定是数字。你通常可以很容易地分辨出区别:对值进行算术运算有意义吗?或者另一个指标:前导零有意义吗?
- 将占用更多空间
- 索引也将占用更多空间,效率更低
- 排序将不能正确工作(例如"10"<2"(
- 任何数字运算都无法正常工作(例如,x以上10%(
说到这里,SSN、电话号码等看似数字但实际上不是数字的字段应该是字符串。
通常,如果数字列是一个ID,并且从未用于计算,则可能是可以的;措施";,像金额或数量一样,我不推荐它,因为你很可能想在某个时候进行计算(如SUM、AVG等(
我在一个外部设计的数据库中遇到了这种类型的问题,该数据库面临着很多挑战:
- 查询期间日期、数字列的转换
- 索引占用更多空间,性能较慢