Sql server 多语种网站的数据库结构

Sql server 多语种网站的数据库结构,sql-server,database-design,multilingual,Sql Server,Database Design,Multilingual,我需要数据库结构来存储不同语言版本的网站内容。现在我是这样做的: [Item] Id SomeColumn [ItemStrings] ItemId LanguageId Title Description ... [Languages] Id Culture 虽然这是一种非常简洁的翻译方法,但在向系统中添加新实体时需要大量的猴子编码。 我想到的另一个解决方案是为所有需要翻译的字符串创建一个全局表,使用唯一id和语言id作为主键。 我更喜欢第二种

我需要数据库结构来存储不同语言版本的网站内容。现在我是这样做的:

[Item]  
Id  
SomeColumn  

[ItemStrings]  
ItemId  
LanguageId  
Title  
Description  
...

[Languages]  
Id  
Culture  
虽然这是一种非常简洁的翻译方法,但在向系统中添加新实体时需要大量的猴子编码。
我想到的另一个解决方案是为所有需要翻译的字符串创建一个全局表,使用唯一id和语言id作为主键。
我更喜欢第二种方式,因为它更干燥

现在,真正的问题是:我可以对所有记录使用nvarchar(MAX)吗?它会消耗更多的内存吗?比如说,只有20%的值会值varchar(max),而其他值则很容易放入nvarchar(50多个)


我使用的是SQL Server 2008。

第二种方法更接近本地化的典型方式(每个字符串都有某种ID,可以查找各种语言)


关于使用nvarchar(MAX),这应该没问题。varchar类型只使用它们所需的空间。

第二种方法更接近于通常的本地化方式(每个字符串都有某种ID,可以查找各种语言)


关于使用nvarchar(MAX),这应该没问题。varchar类型只使用它们所需的空间。

上一个我参与的项目,关键是英文短语,而不是ID。它使代码更容易编写。你调用一个方法GetTranslationFor(“英语短语”,文化);与GetTranslationFor(123,文化)相反

然后,您的开发人员只需编写代码,而不用花时间寻找他们想要的短语的ID,也不用添加它们。如果GetTranslationFor方法在数据库中找不到该短语的翻译,请让其向管理员发送电子邮件通知,以便添加该短语,但返回作为结果输入的短语

在法语网站上显示一个英语短语比出现错误或什么都不显示要好

nvarchar max应该没事


ps我刚才说的是,你的第二种方法看起来不错,我只是用英语短语作为键添加了一个额外的键/索引。

上一个我参与的项目,键是英语短语,而不是ID。它使代码更容易编写。你调用一个方法GetTranslationFor(“英语短语”,文化);与GetTranslationFor(123,文化)相反

然后,您的开发人员只需编写代码,而不用花时间寻找他们想要的短语的ID,也不用添加它们。如果GetTranslationFor方法在数据库中找不到该短语的翻译,请让其向管理员发送电子邮件通知,以便添加该短语,但返回作为结果输入的短语

在法语网站上显示一个英语短语比出现错误或什么都不显示要好

nvarchar max应该没事

ps我刚才说的是,你的第二种方法看起来不错,我只需要添加一个额外的键/索引,使用英语短语作为键。

我会有一个键列(命名实体,例如,“OKAY”,“SaveAs”等-nvarchar(32)应该足够)和一个语言列(我会使用代码,比如英式英语的EN-UK,所以char(5)),因为它们是标准化的。这两列将是唯一的索引/主键。然后,我会为实际文本创建一个列—nvarchar长度随您的喜好而定。我想列/表/数据库应该是utf8

然后,对于字符串,您只有一个对数据库的非联接请求

当翻译不可用时,我也会有退路,所以如果请求的语言没有值,请让您的请求获得EN-US。有总比没有好。

我会有一个键列(命名实体,例如“OK”、“SaveAs”等-nvarchar(32)应该足够)和一个语言列(我会使用代码,比如英式英语的EN-UK,所以char(5)),因为它们是标准化的。这两列将是唯一的索引/主键。然后,我会为实际文本创建一个列—nvarchar长度随您的喜好而定。我想列/表/数据库应该是utf8

然后,对于字符串,您只有一个对数据库的非联接请求


当翻译不可用时,我也会有退路,所以如果请求的语言没有值,请让您的请求获得EN-US。有总比没有好。

但没有理由即使使用数字ID也不能默认为英语。不,没有理由不能按ID默认为英语,这不是重点。关键是你的程序员浪费时间检查短语“主菜单”的ID是什么,如果它不存在,他们就浪费时间创建它。我不会记住100个短语的ID,我也不想花时间在DB中查找它们。我宁愿用英语短语编写代码,并让翻译人员/管理员将它们及其相应的翻译添加到数据库中。这种方法的问题是,我没有主语言。所以我没有关键的短语要翻译。我只需要不同语言的内容的不同版本。但没有理由你不能默认为英语,即使使用数字ID。不,没有理由你不能默认为英语ID,这不是重点。关键是你的程序员浪费时间检查短语“主菜单”的ID是什么,如果它不存在,他们就浪费时间创建它。我不会记住100个短语的ID,我也不想花时间在DB中查找它们。我宁愿用英语短语编写代码,并让翻译人员/管理员将它们及其相应的翻译添加到数据库中。这种方法的问题是,我没有主语言。所以我没有关键的短语要翻译。我只需要不同语言的内容的不同版本。我想,我会在以后的版本中坚持这个解决方案。谢谢你的确认。我想,我会在以后的版本中坚持使用这个解决方案。比