具体来说,在关系数据库管理系统中,为什么我们需要在创建时知道列的数据类型(更可能是对象的属性)?
对我来说,数据类型感觉就像是一种优化,因为一个数据点可以通过多种方式实现。将语义角色和约束分配给数据点然后让引擎在内部检查和优化哪种数据类型最好地为用户服务不是更好吗?
我怀疑这是繁重的地方,为什么要问用户而不是做工作更容易。
你怎么看?我们要去哪儿?这是一个现实的期望吗?或者我有误入歧途的假设?答案 0 :(得分:29)
该类型表示对列值的所需约束。
答案 1 :(得分:16)
答案是存储空间和固定大小的行。
固定大小的行比搜索可变长度的行要快得多,因为如果你知道你想要哪个记录号和字段,你可以直接寻找正确的字节。
编辑:话虽如此,如果在数据库表中使用正确的索引,固定大小的行并不像以前那么重要。
答案 2 :(得分:11)
SQLite 无关紧要。
其他 RDBMS 的使用原则是在早期 80 中设计的,当时它对性能至关重要。
例如, Oracle 不区分NULL
和空字符串,并将其NUMBER
保持为十进制数字集。
今天几乎没有意义,但是当 Oracle 正在开发时,这些是非常聪明的解决方案。
在我开发的其中一个数据库中,使用了非索引值,这些值存储为VARCHAR2
,根据几个条件动态地转换为适当的数据类型。
这是一件非常特殊的事情:它用于使用集合在一次调用数据库时批量加载键值对。
动态SQL
语句用于解析数据并根据键名将它们放入适当的表中。
所有值都按原样加载到临时VARCHAR2
列,然后转换为NUMBER
和DATETIME
以放入其列。
答案 3 :(得分:10)
显式数据类型对于效率和存储来说是巨大的。如果它们是隐含的,则必须“弄清楚”,因此会产生速度成本。索引也很难实现。
我怀疑,虽然不是正面的,但是显式类型平均也会产生更少的存储空间。特别是对于数字,二元int和一串数字字符之间没有比较。
答案 4 :(得分:6)
如果我理解正确,你会问为什么我们为表列指定数据类型,以及为什么“引擎”会自动确定用户需要什么。
数据类型充当约束 - 它们保护数据的完整性。 int列中永远不会有字母,这是一件好事。数据类型不会自动为您决定,您在创建数据库时指定它 - 几乎总是使用SQL。
答案 5 :(得分:4)
你是对的:为列分配数据类型是一个实现细节,与数据库引擎背后的集合论或微积分无关。作为一个理论模型,数据库应该是“无类型的”,并且能够存储我们投入的任何东西。
但是我们必须在具有实际约束的真实计算机上实现数据库。从性能的角度来看,让计算机动态地试图找出如何最好地存储数据是不切实际的。
例如,假设您有一个表,其中存储了几百万个整数。计算机可以 - 正确地 - 弄清楚它应该将每个数据存储为一个整数值。但是,如果你有一天突然尝试在该表中存储一个字符串,那么数据库引擎是否应该停止所有数据,直到它将所有数据转换为更通用的字符串格式?
不幸的是,指定数据类型是必要的恶意。
答案 6 :(得分:3)
如果您知道某些数据项应该是数字整数,并且您故意选择不让DBMS负责执行此操作,那么确保各种事情(例如数据完整性)(确保没有值'A'可以在列中输入,确保不能在列中输入值1.5),例如系统行为的一致性(确保值'01'被认为等于值'1',不是你从类型String获得的行为,...
类型为你处理所有这些事情。
答案 7 :(得分:2)
我不确定数据库中数据类型的历史,但对我来说,知道字段的数据类型是有意义的。
你想什么时候做一些完全是varchar的字段? 如果我知道一个字段是一个整数,那么做一个总和,平均值,最大值等是完全合理的。
答案 8 :(得分:2)
并非所有数据库都以这种方式工作。之前提到过SQLite,但是一组更旧的数据库也是这样做的,多值数据库。
考虑UniVerse(现在是IBM的财产)。它不进行任何数据验证,也不要求您指定它是什么类型。搜索仍然(相对)快,占用的空间更少(由于它动态存储数据的方式)。
您可以使用元数据(字典项)描述数据的外观,但这是限制数据的限制。
请参阅UniVerse
上的维基百科文章答案 9 :(得分:2)
当你在上线后的5个月内推出5亿行时,每个字节都计算在内(在我们的系统中)
在数据库设计中没有“过早优化”这样的反模式。
当然,磁盘空间很便宜,但你使用内存中的数据。
答案 10 :(得分:1)
在过滤(WHERE子句)或排序(ORDER BY)时,您应该关心数据类型。例如,如果这些值是字符串,则“200”比“3”低,而当它们是整数时则相反。
我相信迟早你必须对数据进行排序或过滤(“200”>“3”?)或在报告中使用一些聚合函数(如sum()或(avg())。在此之前你适用于text数据类型:)
答案 11 :(得分:1)
我读过的一本关于数据库理论的书告诉我,SQL标准定义了一个域的概念。例如,高度和宽度可以是两个不同的域。虽然两者都可以存储为数字(10,2),但是如果没有强制转换,则无法比较高度和宽度列。这允许与实现无关的“类型”约束。
我总体上喜欢这个想法,因为我从未见过它,我不知道使用它会是什么样的。我可以看到,当它们的概念域非常不同时,它将减少使用其实现恰好相同的值的错误几率。例如,它也可能有助于阻止人们比较厘米和英寸。
答案 12 :(得分:1)
约束也许是这里提到的最重要的事情。存在用于确保数据正确性的数据类型,因此您确信可以正确操作它。我们可以通过两种方式存储日期。在一种日期或字符串“1893年1月4日”。但弦也可能是“4/1 1893”,“1/4 1893”或类似。数据类型约束它并定义日期的规范形式。
此外,数据类型的优点是可以进行检查。字符串“1975年2月0日”被接受为字符串,但不应作为日期。 “1983年2月30日”怎么样?糟糕的数据库,比如MySQL,默认情况下不会进行这些检查(尽管你可以配置MySQL来实现它 - 你应该这样做。)。
数据类型将确保数据的一致性。这是最重要的概念之一,因为保持数据清晰可以避免精神错乱。
答案 13 :(得分:0)
RDBM通常需要定义列类型,以便快速执行查找。如果你想得到一个庞大的数据集中每一行的第5列,那么定义列是一个巨大的优化。
而不是扫描每一行的某种形式的分隔符来检索第5列(如果列宽不是固定的宽度),RDBM可以只接受sizeOf(column1 - 4(bytes))+ sizeOf(column5(字节))。想象一下,在10,000,000行的表格上会有多快。
或者,如果您不想指定每列的类型,您有两个我知道的选项。将每个列指定为varchar(255),并在调用程序中决定要对其执行的操作。或者,您可以使用使用键值对的其他数据库系统,例如Redis。
答案 14 :(得分:-2)
数据库是关于物理存储的,数据类型定义了这个!!!