我知道这可能是一种“愚蠢”的问题。我之前创建了软件应用程序,然后将基本上所有变量初始化为字符串,并将它们作为VARCHAR保存在我的数据库中。然后,我会从数据库中收集它们并根据需要进行转换。有没有理由这不是一个有效的方法来初始化变量并将它们保存在我的数据库中?
我知道对于非常大的应用程序,这可能会导致计算时间问题,因为我不必要地将可能已初始化的变量转换为适当的类型。但是,对于较小的应用程序,这样做“没关系”吗?
答案 0 :(得分:7)
<强> 1。最不足为奇。如果开发人员要从您的数据库中获取数值数据,他们会发现将它们存储为字符串会很奇怪。
<强> 2。开发人员方便。另一个是每次必须将数据解析为正确类型的麻烦。如果你只是将它存储为正确的类型,那么你可以省去人们不得不放
的麻烦int age = 0;
try {
age = Integer.parseInt(ageStr);
} catch (NumberFormatException e) {
throw new RuntimeException(e);
}
遍布整个代码。
第3。数据质量。上面的代码示例提示了第三个问题。现在,有人可以存储&#34; no_age&#34;或&#34; foo&#34;或列中的某些内容,这是数据质量问题。处理错误的最佳方法是首先使它们无法实现。
<强> 4。存储效率。存储效率也是一个因素。不同的类型有不同的数据编码方式,字符串不是存储数字,位等的有效方法。
<强> 5。网络效率。如果您以浪费的格式存储数据,那么这通常会转化为不必要的网络利用率。这就是二进制格式通常比JSON或XML等文本格式更有效的原因。但是,网络服务通常不会将网络效率视为驾驶工程问题。
<强> 6。处理效率。如果数据本质上是数字的,那么强制每个人解析它会产生处理成本。
<强> 7。不同的类型支持不同的规则。在他的回答中,Hightower指出不同类型有特殊的排序规则,这会影响范围和排序。我喜欢这一点,因为它会影响实际的程序行为,而我上面提到的问题对于单个开发人员的小型应用程序来说可能更具学术性。
假设您要存储8位。如果你要将它作为一个字符串存储,你可能有&#34; TFFTFFTF&#34 ;,在UTF-8和ASCII下将需要64位(每个字符8个字符×8位)来存储8位实际信息。相对而言,这是一个很大的不同。
顺便说一句,即使您的数据是数字,例如,仅使用BIGINT
也不好。数据库中不同类型的整数具有不同的存储要求,因此您应该考虑实际需要的位数,如果合适,使用无符号表示(没有理由在数字上浪费符号位而不是负数)当你创建现在必须是BIGINT的新外键,新行都有一堆BIGINT等时,错误的选择往往会加快。你的存储和备份需求最终会不必要的。
这些效率问题可能对于小事而言根本不重要,这就是你所要求的。或者,正如我上面的JSON / XML示例所示,可能有理由选择效率低的格式而不是效率更高的格式。所以至于它是否正常,我无法回答这个问题,但希望上面的考虑为你提供一些工具来自己做出决定。
我仍然试图养成使用正确类型的习惯,而且我当然不会在没有任何理由的情况下将信息存储为字符串。在bitset的情况下,我可以看到可能避免不得不处理位操作,这可能是棘手的,直到你得到它的悬挂。 (但是有些数据库有特殊的bitset类型。)你提到不知道类型,在某些情况下这可能是合理的原因,尽管我更倾向于在这里进行重构。
答案 1 :(得分:1)
有一些原因。例如,考虑搜索时间范围。使用datetime字段很容易找到它。但是使用字符串并不容易,因为您必须在应用程序中执行此操作。
另一点是varchar上的排序与int类型字段不同。在varchar 10之前是2,但在int之后它就在那之后。