我必须开发一个支持两种语言英语、阿拉伯语的 CMS。该 CMS 将是一种文章发布网站。在设计和分析时,我发现有些文章的长度超过 8000 个字符。我的表有一些列
PageID int,
PageTitleEnglish nvarchar(200),
PageTitleArabic nvarchar(200),
PageDescEnglish nvarchar(500),
PageDescArabic nvarchar(500),
PageBodyEnglish nvarchar(max)
PageBodyArabic nvarchar(max)
如果我将 PageBody 保留为nvarchar(4000),那么 ia 限制为 4000 个字符,如果我必须存储阿拉伯语版本,那么我需要 16000 个字节(因为阿拉伯语是 Unicode,并且占用的空间比 ASCII 多 3 倍)。
所以我只剩下将PageBody 定义为 nVarchar(max)的选项,从性能的角度来看,这会带来不利影响。我的实际问题是,如果 PageBody 列中的某些数据少于 4000 个字符,MS SQL 会比 inline 列中的数据存储还是单独存储在数据库中。
我也在谷歌上寻找了这个,但没有找到任何相关的答案以及在这种情况下我如何提高性能。
欢迎对多语言 CMS 设计的最佳实践提出任何建议。
我只需要支持阿拉伯语和英语两种语言
如果一个值足够短,
nvarchar(max)
它将被存储在“行内”。可以使用sp_tableoption修改默认行为,“行外的大值类型”选项。我不会打扰。数据库引擎将自行有效地管理这一点。
至于设计,根据您的模型,有几种方法可以做到这一点:
1. 分开表格
也就是说,您可以将不同的语言拆分到不同的表中。
这允许表级排序规则而不是列级排序规则
它允许每页允许更多的行和更多的行内 LOB 存储机会
页面父级
PageEnglish(注意 varchar 在这里可能没问题)
PageArabic
2. 单独的行
或者有一个 languageID 列来支持多种语言。
这有一个缺点,即所有语言的排序规则都是固定的,这意味着排序/过滤效果不佳
页面父级
页
这意味着要使所有内容都放在一行中,所有大小的总和必须小于 8K。如果没有,SQL Server 会将 BLOB 存储在行/页之外。
数据量是否如此之大以至于这真的会导致性能问题?
作为另一种选择,您也许可以更改您的数据库结构,以便为英语和阿拉伯语页面设置单独的行,并包含一个语言代码列。这样您就不必将英文和阿拉伯文文本放在同一行中,这在获取数据时也很有意义,因为您可能不需要同时获取英文和阿拉伯文。