我需要数据库结构来存储不同语言的网站内容版本。现在我这样做:
[Item]
Id
SomeColumn
[ItemStrings]
ItemId
LanguageId
Title
Description
...
[Languages]
Id
Culture
虽然这是一种非常简洁的翻译方式,但在将新实体添加到系统中时需要进行大量的编码。
我想到的另一个解决方案是需要翻译的所有字符串的全局表,其中唯一的id和语言id作为主键。
我更喜欢第二种方式,因为它更干燥。
现在,真正的问题是:我可以对我的所有记录使用nvarchar(MAX)吗?是否会消耗更多的内存,例如,只有20%的值值得varchar(max)而其他值很容易适合nvarchar(50-something)?
我正在使用SQL Server 2008。
答案 0 :(得分:2)
我工作的最后一个项目,关键是英语短语,而不是ID。它使代码更容易编写。你调用方法GetTranslationFor(“英语短语”,文化);而不是GetTranslationFor(123,culture);
然后,你的开发人员只是编写代码,而不是花时间寻找他们想要的短语的ID,或者添加它们。让GetTranslationFor方法向管理员发送电子邮件通知,如果它没有在数据库中找到该短语的翻译,那么可以添加它,但是可以返回到作为结果输入的短语。
最好在法语网站上显示一个英文短语,而不是一些错误或什么都没有。
nvarchar max应该没问题。
ps我所说的是你的第二种方法看起来不错,我只是使用英语短语作为你的密钥添加一个额外的键/索引。
答案 1 :(得分:1)
第二种方法更接近于如何进行本地化(每个字符串都有某种ID,可以查找各种语言。)
关于使用nvarchar(MAX),应该没问题。 varchar类型只使用他们需要的空间。
答案 2 :(得分:0)
我有一个关键列(命名实体,例如“OKAY”,“SaveAs”等 - nvarchar(32)应该足够)和一个语言列(我使用的代码,如英国的EN-UK英语,所以char(5))因为这些是标准化的。这两列将是唯一的索引/主键。然后,我会有一个实际文本列 - 尽可能多的nvarchar长度。我想列/表/数据库应该在utf8中?
然后,您只有一个未加入的请求到数据库中的字符串。
如果翻译不可用,我也会有退款,如果请求的语言没有值,请让您的请求获得EN-US。最好是拥有比什么都没有的东西。