只有文本字段的数据库

Mar*_*tin 3 database-design sql-server datatypes

我开始研究现有的 SQL Server 数据库系统,其中大部分字段都存储为文本。除了一些 ID,所有字段都是 varchar(电话号码、邮政编码、日期、地址、货币价值等)。

这不是我学会建立数据库的方式。问同事时说这样比较容易。将所有字段保留在 varchar 中是不好的做法吗?我怎么能争辩说它应该改变?

Mic*_*een 8

尺寸是一种考虑。Anint最多可以在四个字节中容纳 -2,147,483,648。Achar将需要 11 个字节来保存相同的值。

有内置函数来操作各种数据类型。 DATEADD()并且DATEDIFF()是两个例子。这对于日期存储为文本是不可能的。不断地CAST来回不利于高效的处理或清晰的代码。

自动验证是全文本方法的另一个好处。您可能认为一列包含日期,但没有什么可以阻止某人输入值“2014-13-97”。

对于“真正”数字的列,排序不太可能给出预期的结果。例如,如果一列包含整数 '1' 到 '100',并且查询按此列排序,则预期结果为

1, 2 .. 10, 11 .. 20, 21 .. 100
Run Code Online (Sandbox Code Playgroud)

然而,实际结果更有可能是

1, 10, 100, 11, 12, 2, 20, 21 ...
Run Code Online (Sandbox Code Playgroud)

日期可能存在类似的问题,具体取决于所选的字符表示。同样,类型铸造可以用前面提到的成本来解决这个问题。

有时您会发现仅包含数字的字符串。示例是国民身份号码、银行帐号、电话号码等。这些值的共同特征是对它们执行计算没有意义。在其他条件相同的情况下,可以将它们存储为char()列,尤其是当它们具有可选的嵌入字母字符时,但上述注意事项仍然适用。


Dan*_*man 5

你的同事是正确的,简单地不考虑它并将所有内容存储为 varchar 会更容易。但这在空间要求、性能、查询数据的灵活性以及最重要的是缺乏数据完整性方面付出了巨大的代价。这不仅仅是一次性成本;它在应用程序的生命周期内重复支付。

我建议您遵循最佳实践,并使用最适合所存储数据域的数据类型来存储数据,正如您所了解的那样。