如何设计带有动态列的关系数据库?

时间:2019-06-22 12:26:46

标签: mysql sql database rdbms

假设我有一个具有以下结构的课程表。

     courses (Primary keys: (id) )
+-------+--------------------+
|  id   | name               |
+-------+--------------------+
| 1     | Chinese - English  |
| 2     | Japanese - English |
| 3     | Chinese - Spanish  |
+-------+--------------------+

课程将具有这样的列。

   course_columns (Primary keys: (id), Indexes: (course_id) )
+-------+-----------+----------+
|  id   | course_id | title    |
+-------+-----------+----------+
| 1     | 1         | Chinese  |
| 2     | 1         | English  |
| 3     | 1         | Pinyin   |
| 4     | 2         | Japanese |
| 5     | 2         | English  |
| 6     | 2         | Kana     |
| 7     | 2         | Romaji   |   
| 8     | 3         | Chinese  |
| 9     | 3         | Spanish  |
+-------+-----------+----------+

最后,课程将带有这样的单词

    course_word_data (Primary Keys: (id, column_id) )
+------+-----------+-----------+
|  id  | column_id | content   |
+------+-----------+-----------+
| 1    | 1         | 你好      |
| 1    | 2         | hello     |
| 1    | 3         | nĭ hăo    |
| 2    | 1         | 谢谢      |
| 2    | 2         | goodbye   |
| 2    | 3         | xièxie    |
| 3    | 4         | 好む      |
| 3    | 5         | to prefer |
| 3    | 6         | このむ    |
| 3    | 7         | konomu    |
| 4    | 8         | 你好      |
| 4    | 9         | hola      |
+------+-----------+-----------+

现在让我说,在数据库方面,我几乎是一个新手,最近几天,我一直在考虑如何更好地进行设计。用例场景如下:

  1. 用户创建课程
  2. 用户在课程中添加任意数量的带有标题的列
  3. 用户可以修改或删除现有列
  4. 用户可以在课程中添加,修改或删除单词

此外,如果课程中的某个单词是由课程所有者编辑的,则该单词应特定于课程,并且不会影响其他课程。

这是我的问题:

  1. 这是一个好的数据库设计吗?我的问题是,如果一门课程中有十列,则意味着Course_word_data表中有一个单词有十行。基本上对于m列和n个单词,单个课程有m * n行。假设有5000个课程,每个课程的平均列数为6。如果每个课程平均有1000个单词,则意味着有5000 * 6 * 1000 = 3000万行。这样设计可以吗,还是应该重新考虑设计?有什么更好的方法呢?

  2. 是否可以减少重复单词的数量?如您所见,表中两次出现“你好”一词。有减少它的有效方法吗?

课程示例(将其视为网页上的网格元素)

    +------------+--------------+--------------+
    | English    | Pinyin       | Chinese      |
    +------------+--------------+--------------+
    | hello      | nĭ hăo       | 你好         |
    | goodbye    | xièxie       | 谢谢         |
    +------------+--------------+--------------+
    (Columns can be added or removed by the user. 
     For example part of speech column which indicates 
     whether a column is noun, ver, adjective etc. )

我对问题的长度表示歉意。

1 个答案:

答案 0 :(得分:0)

在此处调用关注点分离原则; HTML表(视图)与数据库表(持久性)不同。

视图上下文中的

“用户添加列” 等同于查询上下文中的“用户选择列” 。用户应该创建语言吗?也许没有,语言已经在那里。

旁注:在翻译问题中,单词上下文很有用。