Как спроектировать реляционную базу данных с динамическими столбцами? - PullRequest
0 голосов
/ 22 июня 2019

Допустим, у меня есть таблица курсов со следующей структурой.

     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 = 30 миллионов строк. Можно ли делать дизайн таким образом, или я должен пересмотреть свой дизайн? Что было бы лучшим способом сделать это?

  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 голосов
/ 22 июня 2019

Вызов Разделение проблем принцип здесь; Это не то же самое, что таблица HTML (представление), чем таблица базы данных (постоянство).

«Пользователь добавляет столбцы» в контексте просмотра будет эквивалентно «Пользователь выбирает столбцы» в контексте запроса. Должен ли пользователь создавать языки? Может и нет, языки уже есть.

Примечание: в задачах перевода полезен контекст слова .

...