我们有一条主记录,允许用户输入记事。每个主记录有18个单独的“备注”字段。
目前我们已将其规范化为另一个名为notes的表,其中包含ID外键列和单个varchar(8000)列,然后我们根据需要将它们连接在一起。我相信这是SQL Server 2000中推荐的方法。
我们最近迁移到了具有varchar(MAX)的SQL Server 2008,如果我们删除单独的notes表并使用varchar(MAX),我们想知道它是否更好或相等。肯定会更方便。
答案 0 :(得分:3)
在“主要”表格中设置varchar(max)
字段是一个坏主意,特别是如果您已经对它进行了一定程度的规范化。
这也会导致主表上的页面拆分,碎片和性能非常差。
当有人添加注释时,如果该字段不在该注释表中,则可能会填满数据页并导致其分割到另一个页面,这是碎片, BAD 。
答案 1 :(得分:3)
我对你的设置并不完全清楚...如果你说用户可以输入18个单独的音符(可能是不同的“类型”),那么你应该保留二级音符表。在这种情况下,是的,从varchar(8000)
切换到varchar(MAX)
将允许用户在笔记中存储超过8000个字符。
为了清楚起见,如果用户输入了个人备注,那么您应该将表格保持原样,就像现在一样。您是否应该从varchar(8000)
切换到varchar(max)
是一个问题,您是否希望允许用户使用超过8000个字符。请注意,如果他们这样做,内容将存储在行外,就像您在2005年之前的SQL Server中使用TEXT
类型一样。
如果您说(听起来有点像),用户可以输入一个大注释,并将其动态拆分为多个块,每个最多包含8000个字符,然后您应删除第二个表并在父记录上放置一个varchar(MAX)
列。
这就是你问的问题吗?
答案 2 :(得分:2)
更好的设计是保留Notes表(你仍然可以通过使用VARCHAR(MAX)增加Note的长度,这会引入一些减速)。
这将允许您将每个注释独立于数据库中的独立实体处理。
答案 3 :(得分:0)
我将设置一个Note表,其主键包含其父实体的外键和注释编号,以及单个[n] varchar(max)列。这允许您为每个父实体提供多个注释。
varchar(max)将在单个传统列中存储多达8000个八位字节。如果大小超过(最大2.1gb),数据溢出到溢出页面,就像[now-deprecated] text / ntext / image一样。处理文本/ blob数据是一个巨大的麻烦:SQL现在处理它 sotto voce ,就像它一样。你得到的只是一个字符串。