数据库模型:如何设计多语言帮助系统数据库?

时间:2017-07-11 07:03:08

标签: database database-design relational-database

我有点困惑这个"简单"数据库设计。也许有人有更好的主意。我需要设计一个具有以下要求的帮助系统:

  • 帮助内容有标题
  • 帮助内容包含内容
  • 帮助内容是多语言(标题和内容)
  • 英语帮助内容是强制性的
  • 当使用其他语言的内容不可用时,英语帮助内容始终用作后备
  • 可以将帮助内容分配给多个类别

enter image description here

似乎是一个非常简单的模型,但我的问题是以下

1)当英语是后备语言并且总是需要先创建才能创建其他语言之前,使用ParentId是一个好的设计吗?

2)我如何使用后备语言进行查询?我的意思是假设用户选择西班牙语作为他的首选语言。但对于西班牙语,一些内容不存在于西班牙语中,而仅以英语存在。如何查询以西班牙语存在的项目,但也返回仅包含没有西班牙语孩子的英语内容的项目。

1 个答案:

答案 0 :(得分:0)

我对你的图表有一些评论:

HelpContentHelpContent_Categories之间的关系的关系基数(仅在图表中)不正确。关系的许多结尾应附加到交叉实体类型(HelpContent_Categories)。外键位于正确的位置,但线条绘制不正确。

HelpContentLanguage之间的基数不正确。您显示的是1:1,但基数应为1:M。

总的来说,我会以不同的方式处理这些规定的要求。我希望强制性英语内容是一个表格,所有翻译都是与Language相交的单独表格。您可以使用ParentId将这样的安排压缩到您已经显示的表格中,但这可能会令人困惑。它当然不会使用架构来强制执行您的业务规则,即英语是强制性的,所有其他语言都是可选的。

考虑这个ERD: ERD

英文内容位于CategoryHelpContent表格中。所有翻译的值都在Language的交集表中。

要查询任何给定语言的帮助,您可以使用转换表OUTER JOIN main / English表,然后将翻译的和英语值COALESCE放在一起。如果翻译存在,那么您将获得翻译。如果它不存在,你会把英语作为后备。

我不得不承认,让我错误地使用两个表而不是一个表,但它确实使用模式强制执行您的业务规则,而不是必须编写和维护的额外代码。