如果某些数据少于4000个字符,nvarchar(max)如何将数据存储在数据库中?


8

我必须开发一个CMS,以支持两种语言的英语,阿拉伯语。该CMS将是一种Article Publishing网站。在设计和分析时,我发现有些文章的长度超过8000个字符。我的表有一些列

PageID int,
PageTitleEnglish nvarchar(200),
PageTitleArabic nvarchar(200),
PageDescEnglish nvarchar(500),
PageDescArabic nvarchar(500),
PageBodyEnglish nvarchar(max)
PageBodyArabic nvarchar(max)

如果我将PageBody保留为nvarchar(4000),则限制为4000个字符,如果我必须存储阿拉伯语版本,则我需要16000个字节(因为阿拉伯语是Unicode,并且比ASCII占用3倍的空间)。

因此,我只剩下将PageBody定义为nVarchar(max)的选项,这从性能的角度来看是不利的。我的实际问题是,如果PageBody列中的某些数据少于4000个字符,它将比内联列中的数据或数据库中单独存储的数据少。

我也在Google上寻找了这个,但没有找到任何相关的答案以及在这种情况下如何提高性能。

欢迎为此类多语言CMS设计提供最佳实践建议。

我只需要支持两种语言,阿拉伯语和英语


您会一直有英语和阿拉伯语吗?也许只是一个可选的?如果是这样,将始终是强制性的吗?您以后会期望更多语言吗?
gbn

Answers:


9

如果nvarchar(max)值足够短,则将在“ 行内 ” 存储该值。

可以使用sp_tableoption,“大值类型超出行”选项来修改默认行为。我不会打扰的。DB引擎将自己有效地管理它。

至于设计,有几种基于模型的方法:

  • 您将始终拥有英语和阿拉伯语吗?
  • 可以选一个吗?如果是这样,将始终是强制性的吗?
  • 您以后会期望更多语言吗?

1.分开的桌子

也就是说,您可以将不同的语言拆分为不同的表。
这允许表级别的排序规则,而不是列级别的排序规则

它允许每页更多行,并且行LOB存储的机会更大

家长

  • PageID int,
  • PageOtherInfo ...

PageEnglish(注意varchar在这里可能没问题)

  • PageID int,
  • PageTitleEnglish varchar(200),
  • PageDescEnglish varchar(500),
  • PageBodyEnglish varchar(最大)

PageArabic

  • PageID int,
  • PageTitleArabic nvarchar(200),
  • PageDescArabic nvarchar(500),
  • PageBodyArabic nvarchar(max)

2.分开的行

或有一个languageID列来支持几种语言。
缺点是所有语言的排序规则都是固定的,这意味着排序/过滤效果很差

家长

  • PageID int,
  • PageOtherInfo ..

  • PageID int,
  • 语言代码,
  • PageTitle nvarchar(200),
  • PageDesc nvarchar(500),
  • PageBody nvarchar(max)

4
  • MS SQL Server的固定页面大小为8KB。
  • 一行永远不会分成几页,但是几行可以共享一个页面。
  • 但是,nvarchar(max)和其他BLOB数据可以存储在行/页之外。

这意味着,要使所有内容都适合一行,所有大小的总和必须小于8K。如果不是,SQL Server将在行/页之外存储BLOB。

数据量是否太大以至于这确实会导致性能问题?

作为另一种选择,您可能会更改数据库结构,以使英语和阿拉伯语页面具有单独的行,而改为包含语言代码列。这样一来,您就不必在同一行中同时显示英语和阿拉伯语文本,并且在获取数据时也很有意义,因为您可能不需要同时获取英语和阿拉伯语。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.