Сохранение активности пользователя? PHP, MySQL и дизайн базы данных - PullRequest
1 голос
/ 03 декабря 2011

Хорошо, поэтому пользователь заходит в мое веб-приложение и получает очки и тому подобное за активность, что-то вроде (но не так сложно), как этот сайт.Они могут голосовать, комментировать, отправлять, избирать, голосовать за комментарии, писать описание и т. Д. И т. Д.

В настоящий момент я сохраняю действие пользователя в таблице с такой датой, как

Table user_actions
    action_id       - PK AI int
    user_id         - PK int
    action_type     - varchar(20)
    date_of_action  - datetime

Так, например, если пользователь приходит и оставляет комментарий или голосует за комментарий, то строки будут выглядеть примерно так

    action_id       = 4
    user_id         = 25
    action_type     = 'new_comment'
    date_of_action  = '2011-11-21 14:12:12';

    action_id       = 4
    user_id         = 25
    action_type     = 'user_comment_vote'
    date_of_action  = '2011-12-01 14:12:12';

Все хорошо, я слышу, как вы говорите, но не совсем, помните, чтоэти строки будут находиться в таблице user_actions, которая отличается от тех, в которых хранятся комментарии и голоса пользователей.

Итак, как мне узнать, какой комментарий связан с какой строкой в ​​user_actions?

Ну, я мог бы просто связать уникальную comment_id в таблице комментариев с новым столбцом, который называетсяtarget_primary_key в таблице user_actions?

Нет.Не может этого сделать, потому что в равной степени действие могло бы быть user_comment_vote, у которого есть составной ключ (двойной ключ)?

Итак, мысль, с которой я остаюсь, состоит в том, нужно ли просто добавить первичные ключи встолбец и запятая их уменьшают и позволяют PHP разбирать это?Итак, взяв пример выше, строки ниже показывают, как я буду хранить целевые первичные ключи

new_comment
target_primary_keys - 12 // the unique comment_id from the comments table 

user_comment_vote
target_primary_keys - 22,12 // the unique comment_id from the comments table 

Таким образом, в основном пользователь выполняет действие, обновляется user_actions и, соответственно, конкретный table, но как связать эти два параметра, сохраняя при этом несколько ключей?

Кто-нибудь имел опыт хранения пользователяактивность раньше?

Любые мысли приветствуются, здесь нет неправильных ответов.

Ответы [ 2 ]

2 голосов
/ 03 декабря 2011

Вам не нужна таблица действий пользователя.Чтобы вычислить «оценку», вы можете выполнить один запрос по нескольким таблицам и умножить количество совпадающих комментариев, оценок и т. Д. На множитель (25 баллов за комментарий, 10 за рейтинг, ...).

Чтобы ускорить свою страницу, вы можете сохранить общий балл в дополнительной таблице или пользовательской таблице и обновить общий балл с помощью триггеров, если счет меняется.

Если вы хотите отобразить количество оценок или комментариев, которые выможет сделать то же самое.

Получить детали из существующих таблиц и сохранить общее количество комментариев и оценок в дополнительной таблице.

0 голосов
/ 03 декабря 2011

Самый простой ответ состоит в том, чтобы просто использовать другую таблицу, которая может содержать несколько совпадений для любого ключа и предоставлять широкие возможности индексирования:

create table users_to_actions (
   user_id int(20) not null,
   action_id int(20) not null,
   action_type varchar(25) not null,
   category_or_other_criteria ...
);

create index(uta_u_a) on users_to_actions(user_id, action_id);

Чтобы немного углубиться в это, вы должны выбрать элементы, соединив их с этой таблицей:

select
  *
from
  users_to_actions as uta join comments as c using(action_id)
where
  uta.action_type = 'comment' and user_id = 25
order by
  c.post_date

Или, может быть, вложенный запрос в зависимости от ваших потребностей:

  select * from users where user_id in(
      select
         user_id
      from 
         users_to_actions
      where
         uta.action_type = 'comment'
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...