【问题标题】:Database model: How to design a multilanguage help system database?数据库模型:如何设计多语言帮助系统数据库?
【发布时间】:2017-07-11 18:58:10
【问题描述】:

我对这种“简单”的数据库设计有点坚持。也许有人有更好的主意。我需要设计一个具有以下要求的帮助系统:

  • 帮助内容有标题
  • 帮助内容有内容
  • 帮助内容是多语言的(标题和内容)
  • 必须提供英文帮助内容
  • 当其他语言的内容不可用时,始终使用英文帮助内容作为后备内容
  • 一个帮助内容可以分配给多个类别

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

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

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

【问题讨论】:

    标签: database database-design relational-database


    【解决方案1】:

    我在你的图表上有几个 cmets:

    HelpContentHelpContent_Categories 之间连接的关系基数(仅在图表中)不正确。关系的 many 端应附加到相交实体类型 (HelpContent_Categories)。外键放对了,但是线画错了。

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

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

    考虑这个 ERD:

    英文内容在CategoryHelpContent 表中。所有翻译后的值都在与Language 的交集表中。

    要查询任何给定语言的帮助,请将主/英语表与翻译表进行 OUTER JOIN,然后将翻译后的值和英语值合并在一起。如果翻译存在,那么您将获得翻译。如果它不存在,你会得到英语作为后备。

    我不得不承认,拥有两个表而不是一个表让我很不爽,但它确实使用架构而不是必须编写和维护的额外代码来强制执行您的业务规则。

    【讨论】:

    • 嗨乔尔。谢谢你的回答。我是否正确理解我在Help Content 表中有主要英语内容,然后在Content Translation 表中有主要英语项目的ID 和语言ID?
    • @STORM 是的。主要英文内容在HelpContent 表中,翻译后的内容在ContentTranslation 表中,以及HelpContent 的外键(例如HelpContentId)和Language 的外键(例如LanguageId 或代码,或者你正在使用的任何东西)
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多