可能重复:
多语言数据库的模式
我正在开发一个我计划以多种语言提供的Web应用程序.在设计数据库时,我会在两种不同的方式之间来回传递,以便在数据库中存储本地化描述和诸如此类的东西.
第一个选项是众所周知的table_name,table_name_ml类型选项:
TABLE Category (
ID int,
ParentID int,
Name varchar(50),
Description varchar(255)
)
TABLE Category_ML (
ID int,
CategoryID int,
LocaleID int,
Name varchar(50),
Description varchar(255)
)
Run Code Online (Sandbox Code Playgroud)
第二种选择是根本不将文本存储在基表中,而是存储一个可用于在其他地方查找实际本地化文本的标记,如下所示:
TABLE Category (
ID int,
ParentID int,
NameToken varchar(50),
DescriptionToken varchar(50),
)
// Tables in a separate content management type system
TABLE Content (
ID int,
Token varchar(50)
)
TABLE Translation (
ID int
ContentID int,
LocaleID int,
Value text
)
Run Code Online (Sandbox Code Playgroud)
这里的想法是内容和转换表将保存数据库中许多不同实体的本地化文本.服务层将仅使用标记返回基础对象,视图层将使用内容/转换表查找实际文本值 - 这将被高度缓存.内容/翻译表还将用于存储其他CMS类型内容(网页上的静态文本等)
我喜欢第一个选项,因为它尝试过并且是真的,但第二个选项似乎还有很多其他优点:
由于我以前从未见过这样的设计,我认为我必须遗漏一些东西.有没有好的理由不以这种方式设计呢?或者也许有一个我没有想过的更好的选择?