不同语言测验的数据库设计

时间:2018-06-25 11:52:08

标签: mysql sql database-design relational-database

我正在尝试进行一次支持多种语言的测验。我已经为测验和用户结果制作了数据库架构,但是不确定如何以良好的方式实现对不同语言的支持。

这是现在的样子(可以指出设计错误):

* User:
   - id          PK
   - name
   - email
   - password

* Quiz
   - id          PK
   - slug
   - title

* Question
   - id          PK
   - quiz_id     FK
   - question
   - image
   - message

* Option
   - id           PK
   - question_id  FK
   - option
   - is_right

Relation between user and quiz to store results:

* Result
   - id           PK
   - user_id      FK
   - quiz_id      FK

* Result Details
   - id           PK
   - result_id    FK
   - question_id  FK
   - option_id    FK (The option user choose)
   - is_right

数据库设计相同,但表之间的连接清晰明了:

enter image description here

我的第一个念头是在测验表中建立一个母语表(语言表有许多测验):

* Language:
   - id          PK
   - language_title

* Quiz
   - id           PK
   - language_id  FK
   - slug
   - title

但这只会创建一个语言类别,管理员将不得不为另一种语言创建一个全新的测验,而不仅仅是添加新的问题文本和选项文本。

我应该如何设计多种语言的测验数据库,以便只有带有文本(标题,消息,问题和选项)的列才需要获得新的记录,而不必创建全新的测验?

3 个答案:

答案 0 :(得分:0)

我会建议以下一般路线:

1)使用字段language_id,string_id,value创建一个表(翻译?)。每个string_id都与特定的消息相对应,与语言无关。因此,所有string_ids x所有language_ids =不同翻译的所有可能消息。因此,(language_id,string_id)是PK,值是测验者应该看到的东西。

2)用string_id替换表上的每个文本字段。

3)当您的演示环境必须显示一个string_id时,它将从1)WHERE language_id =您的测验者选择的表中选择的表中进行选择。

答案 1 :(得分:0)

首先,您应该查看您选择的键。您当前的设计(原子替代键无处不在)允许各处出现不一致的情况。除非您有其他未提及的多表约束,否则您可以有一个Result_detail属于测验B的问题A,但是有一个Option属于测验D的问题C,以及一个结果属于测验E。

除非您有其他未提及的键,否则您的设计将允许实际的重复。您可以例如除了id之外,有两个相同的Result_details,这似乎意味着相关用户在同一Result中两次回答了同一问题。让用户多次参加同一测验可能是一项功能,但是您可能不希望在同一测验结果中对同一问题有多个相等(或不同)的答案。这实际上是一个很好的例子,说明在某些情况下非关键性地引入替代键会完全忽略键的要点。

Result_details.Is_right显得多余。即使Result_detail选项不正确,您也可以使用正确的Result_detail吗?

还有其他问题,但是要解决主要问题:如果您使用固定数量的语言(特别是如果所有问题和选项都具有所有语言的字符串),则只需为每个问题添加“问题”和“选项”列语言。如果有人大喊第一范式,请忽略它们(或要求他们正式定义1NF)。

如果您使用的语言数量不限,请将“问题”和“选项”列移到单独的表中,并将“语言”列和外键分别移至“问题”和“选项”表中。使用例如ISO 639表示“语言”列的值;这样一来,您不一定需要语言表。

答案 2 :(得分:0)

数据库设计应遵循更普遍的 信息设计模型 ,该模型应源自 概念信息模型 以UML类图的形式呈现(由于其表达能力)。以下是针对您的问题的概念性信息模型:

conceptual information model

为了获得信息设计模型,仍然必须用适当的标准标识符属性和数据类型来丰富这种模型。通过消除关联和组成(将它们替换为参考属性),我们获得了以下OO类模型,该模型可用作编码Java / C#/ PHP / etc的基础。课程:

OO class model

请注意,我们在OO类模型中增加了对多语言测验的支持,方法是添加一个IsoLanguageCode枚举和一个TextItem类,该类具有由文本项ID和语言组成的两部分主键诸如测验,问题和答案选项的代码使用文本项ID来引用用作标题,问题文本和答案文本的文本项。还要注意,Quiz类具有一个派生属性\availableLanguages,该属性可以借助查询来计算,该查询检索所有语言,其中所有测验问题的文本项及其所有答案选项均为可用。

可以通过将引用属性替换为相应的外键属性来从此类OO类模型派生SQL数据库设计模型:

SQL database design model