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