我正在尝试制作一个支持多种语言的测验。我已经为测验和用户结果制作了数据库模式,但不确定如何以好的方式实现对不同语言的支持。
这是现在的样子(请随时指出设计错误):
* 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
相同的数据库设计,但表之间的联系清晰:
我的第一个想法是给quiz表做一个父语言表(语言表有很多quizz):
* Language:
- id PK
- language_title
* Quiz
- id PK
- language_id FK
- slug
- title
但这只会创建一个语言类别,管理员将不得不为不同的语言创建一个全新的测验,而不仅仅是添加新的问题文本和选项文本。
我如何为多种语言设计测验数据库,以便只有带有文本的列(标题、消息、问题和选项)必须获得新记录,而不是必须创建一个全新的测验?
最佳答案
数据库设计应遵循从概念信息模型派生的更通用的信息设计模型,最好以 UML 类图的形式(因为它们的表现力)。以下是您的问题的概念信息模型:
这样的模型仍然需要用合适的标准标识符属性和数据类型来丰富,以获得信息设计模型。通过消除关联和组合(用引用属性代替它们),我们得到如下面向对象的类模型,它可以作为Java/C#/PHP等编码的基础。类:
请注意,我们通过添加一个 IsoLanguageCode
枚举和一个包含两部分主键的 TextItem
类,在这个 OO 类模型中添加了对多语言测验的支持文本项 ID 和语言代码,以便测验、问题和答案选项使用文本项 ID 来引用用作其标题、问题文本和答案文本的文本项。还要注意 Quiz
类有一个派生属性 \availableLanguages
可以在查询的帮助下计算,该查询检索所有语言,其中文本项用于测验的所有问题,以及他们所有的答案选项都可用。
通过用相应的外键属性替换引用属性,可以从这样的 OO 类模型派生出 SQL 数据库设计模型:
关于mysql - 不同语言测验的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51022843/