Допустим, у меня есть таблица курсов со следующей структурой.
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 |
+------+-----------+-----------+
Теперь позвольте мне сказать, что я в значительной степени новичок, когда дело доходит до базы данных, и в течение последних нескольких дней я думал о том, как лучше спроектировать это. Сценарий использования выглядит следующим образом:
- Пользователь создает курс
- Пользователь добавляет произвольное количество столбцов с заголовками к курсу
- Пользователь может изменять или удалять существующие столбцы
- Пользователь может добавлять, изменять или удалять слова в курсе
Кроме того, если слово в курсе редактируется владельцем курса, оно должно относиться к конкретному курсу и не должно влиять на другие курсы.
Вот мои вопросы:
Это хороший дизайн базы данных? Моя проблема в том, что если в курсе десять столбцов, то это означает, что в таблице course_word_data для одного слова есть десять строк. В основном для m столбцов и n слов существует m * n строк для одного курса. Предположим, что имеется 5000 курсов, а среднее число столбцов на курс равно 6. Если в каждом курсе в среднем 1000 слов, это означает, что 5000 * 6 * 1000 = 30 миллионов строк. Можно ли делать дизайн таким образом, или я должен пересмотреть свой дизайн? Что было бы лучшим способом сделать это?
Можно ли уменьшить количество повторяющихся слов? Как видите, слово 「你好」 существует в таблице два раза. Есть ли эффективный способ уменьшить его?
Пример курса (представьте, что это элемент сетки на веб-странице)
+------------+--------------+--------------+
| 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. )
Я заранее прошу прощения за длину вопроса.