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

标签 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

我的第一个想法是给quiz表做一个父语言表(语言表有很多quizz):

* Language:
   - id          PK
   - language_title

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

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

我如何为多种语言设计测验数据库,以便只有带有文本的列(标题、消息、问题和选​​项)必须获得新记录,而不是必须创建一个全新的测验?

最佳答案

数据库设计应遵循从概念信息模型派生的更通用的信息设计模型,最好以 UML 类图的形式(因为它们的表现力)。以下是您的问题的概念信息模型:

conceptual information model

这样的模型仍然需要用合适的标准标识符属性和数据类型来丰富,以获得信息设计模型。通过消除关联和组合(用引用属性代替它们),我们得到如下面向对象的类模型,它可以作为Java/C#/PHP等编码的基础。类:

OO class model

请注意,我们通过添加一个 IsoLanguageCode 枚举和一个包含两部分主键的 TextItem 类,在这个 OO 类模型中添加了对多语言测验的支持文本项 ID 和语言代码,以便测验、问题和答案选项使用文本项 ID 来引用用作其标题、问题文本和答案文本的文本项。还要注意 Quiz 类有一个派生属性 \availableLanguages 可以在查询的帮助下计算,该查询检索所有语言,其中文本项用于测验的所有问题,以及他们所有的答案选项都可用。

通过用相应的外键属性替换引用属性,可以从这样的 OO 类模型派生出 SQL 数据库设计模型:

SQL database design model

关于mysql - 不同语言测验的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51022843/

相关文章:

mysql - 关于在 MYSQL 中使用自动增量字段作为唯一标识符的问题

database - 如何规范化数据库模式

mysql - 我无法在Windows中更改mysql的datadir

php - 有没有办法将关联查询显示为行?

mysql - Rails 3 自动创建联接表关联

sql - ORA-01791 : not a SELECTed expression PL SQL

php - 从表单中的第二个表发布变量

c# - '<name>' 中的未知列 'where clause'

sql - 如何在 Oracle 中通过 YTD 值计算 MTD 和 QTD

sql - 酒店预订系统 : optimal SQL db structure for querying