Muranx
@Muranx
кто понял this тот в цирке не смеётся

Как организовать таблицу достижений на сайте?

Здравствуйте!

Идея проста, есть таблица user
+----+-----------+
| id | user_name |
+----+-----------+
|  1 | Dima      |
|  2 | Sveta     |
|  3 | Katya     |
|  4 | Jenya     |
+----+-----------+

Нужно сделать таблицу достижений, которая будет связана с пользователями из таблицы user к примеру по id и которая будет хранить в себе достижения пользователей в программе обучения на сайте! первое что приходит в голову учитывая мой 3х недельный опыт изучения скл это ....
+-----------------+----------+----------------+-----------------+---------------+
| achievements_id | users_fk | pass_first_lvl | pass_second_lvl | invite_friend |
+-----------------+----------+----------------+-----------------+---------------+
|               1 |        1 |              1 |               0 |             1 |
|               2 |        2 |              0 |               0 |             1 |
|               3 |        3 |              1 |               0 |             0 |
|               4 |        4 |              0 |               0 |             1 |
+-----------------+----------+----------------+-----------------+---------------+

... где разумеется achievements_id это первичный ключ, а users_fk это внешний ключ связанный с таблицей user по полю id, там где в ячейке 1 разумеется достижение получено , ну а там где 0 что бы вы думали...? достижение ещё не выполнено ! Но сразу встаёт вопрос :

1. Как быть , если ачивок будет больше чем 4 ( а их 100% будет больше чем 4), например 100 достижений, это же получится таблица монстр?

Далее... Разумеется золотым стандартом ачивок является дата, когда они получены (ну допустим чтобы в дальнейшем использовать эту дату в каком-то общем рейтинге), есть идея....
+-----------------+----------------------+---------------------+----------------------+--------------------+
| achievements_id | achievements_date_fk | pass_first_lvl_date | pass_second_lvl_date | invite_friend_date |
+-----------------+----------------------+---------------------+----------------------+--------------------+
|               1 |                    1 | 2021-12-05          | 0000-00-00           | 2020-04-01         |
|               2 |                    2 | 0000-00-00          | 0000-00-00           | 1987-11-03         |
|               3 |                    3 | 2011-05-05          | 0000-00-00           | 0000-00-00         |
|               4 |                    4 | 0000-00-00          | 0000-00-00           | 2019-07-16         |
+-----------------+----------------------+---------------------+----------------------+--------------------+

.. ещё одна таблица - монстр с датами этих ачивок, которая соединена с таблицей user по id
В общем главный вопрос тут думаю про реализацию структуры бд, и на сколько это разумная идея организовывать таблицы достижений именно так, как Я с высоты своего опыта ( -_- ) ? Спасибо, за внимание, будьте корректны и не занудничайте через-чур !
  • Вопрос задан
  • 358 просмотров
Решения вопроса 1
@galaxy
Несмотря на то, что вы несколько таблиц нарисовали, из того, что вы пишете, понятно, что все эти таблицы - суть одна (связь один-к-одному), т.е. налицо отсутствие нормализации.
Достижений у юзера может быть много, разного типа, так что тут должна быть связть один-ко-многим, что-то типа:
+-----------------+----------+----------------+-----------------+
| achievements_id | users_fk |      type      |      date       |
+-----------------+----------+----------------+-----------------+
|               1 |        1 |              1 |      2021-10-01 |
|               2 |        2 |              1 |      2021-10-04 |
|               3 |        1 |              2 |      2021-10-08 |
|               4 |        1 |              4 |      2021-10-15 |
+-----------------+----------+----------------+-----------------+


Если у самих ачивок в зависимости от типа будут разные свойства, можно еще один уровень связи один-ко-многим сделать:
+-----------------+-----------+----------------+-----------------+
| achieve_prop_id | acieve_fk |      type      |      value      |
+-----------------+-----------+----------------+-----------------+
|               1 |         1 |              1 |           'abc' |
|               2 |         2 |              1 |           '145' |
+-----------------+-----------+-----------------+----------------+
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы