为什么每个RDBMS都坚持要告诉它文本字段的最大长度是什么...为什么它不能仅仅根据放入数据库的数据来推断这些信息?
我主要使用MS SQL Server,但我知道的每个其他数据库也要求您在数据模式上设置这些任意限制。实际情况是,由于业务需求一直在变化,而且几乎每天都有一些最终用户试图在该列中添加大量文本,因此这并不是特别有用或友好的工作。
是否有任何具有RDBMS内部工作知识的人知道我们为什么不推断存储数据的限制?我不是在猜测类型信息,而是猜测特定文本列的限制。
我的意思是,我没有在数据库中的每个文本列上使用nvarchar(max)。
答案 0 :(得分:5)
因为计算机(和数据库)很愚蠢。计算机不能很好地猜测,除非你告诉他们,否则他们无法分辨出一列将被用于电话号码或战争与和平的副本。显然,数据库可以设计成每列可以包含无限量的数据 - 或者至少与磁盘空间允许的数据一样多 - 但这将是一个非常低效的设计。为了提高效率,我们进行权衡,并让设计师告诉数据库我们希望在列中添加多少。据推测,可能存在默认值,因此如果您未指定默认值,则只使用它。不幸的是,从效率的角度来看,任何违约都可能不适合绝大多数人。
答案 1 :(得分:2)
这与速度有关。如果指定了字符串的最大大小,则可以优化信息的存储方式,以便更快地对其进行i / o操作。当速度是关键时,你想要的最后一件事就是因为你将状态缩写改为全名而突然改变了所有数据。
设置最大大小后,数据库可以为该列中的每个实体分配最大空间,无论值的更改如何,都不需要更改地址空间。
答案 2 :(得分:1)
This post不仅可以回答您关于是否在任何地方使用nvarchar(max)
的问题,还可以深入了解数据库历史上不允许这样做的原因。
答案 3 :(得分:1)
这就像说,为什么我们不能告诉数据库我们想要一个表,让它从我们提供的数据中推断出我们需要什么类型和多少列。
简单地说,我们比数据库更了解。假设您有一个百万分之一的机会将2,000个字符的字符串放入数据库,大多数情况下,它是100个字符。数据库可能会炸毁或拒绝2k字符串。如果前三年你只输入了100个长度的字符串,它根本无法知道你需要2k长度。
此外,字符的长度用于优化行位置,以便可以更快地读取/跳过行。
答案 4 :(得分:0)
我认为这是因为RDBMS使用随机数据访问。要进行随机数据访问,他们必须知道必须跳入硬盘中的哪个地址才能快速读取数据。如果单个列的每一行都有不同的数据长度,则无法推断出他们必须直接跳转才能获得它的地址的起点。唯一的方法是他们必须加载所有数据并进行检查。
如果每次添加,更新和删除时,RDBMS都会将列的数据长度更改为固定数(例如,所有行的最大长度)。这是一个非常耗时的
答案 5 :(得分:0)
数据库的基础是什么?如果业务需求经常变化,那将会和您一样惊讶。如果有一个原因你没有使用nvarchar(max),那么可能还有一个原因就是它没有默认...
答案 6 :(得分:0)
答案 7 :(得分:0)
为了举个例子,我将进入一些流沙并建议你将它与分配内存(RAM)的应用程序进行比较。为什么程序员在程序启动时不需要/分配所需的所有内存?因为他们经常不知道他们需要多少钱。这可能导致应用程序在运行时抓取越来越多的内存,也许还会释放内存。并且您有多个应用程序同时运行,新应用程序启动,旧应用程序关闭。应用程序总是需要连续的内存块,如果内存遍布地址空间,它们的工作效果很差(如果有的话)。随着时间的推移,这会导致内存碎片化,以及人们几十年来一直在撕扯头发的垃圾收集问题。
跳回数据库。你想要你的硬盘驱动器发生这种情况吗? (请记住,与内存操作相比,硬盘性能非常低,非常慢...)
答案 8 :(得分:0)
听起来您的业务规则是:在任何文本框中输入您想要的信息,这样您就不会对DBA感到生气。
您不允许用户输入5000个字符地址,因为它们不适合信封。
这就是为什么Twitter有一个文本限制,并节省每个人阅读一堆无意义的驱动器的麻烦,只是继续下去,从来没有达到目的,但只是设法激怒读者让他们想知道为什么你有这样的通过选择一种以自我为中心和不人道的生活方式来摒弃他们的时间,专注于促进复制和粘贴与记忆缓冲神允许的数据一样多的数据......