структура базы данных активности пользователей - PullRequest
4 голосов
/ 19 января 2010

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

  1. Профиль пользователя "A".
  2. Страница друзей пользователя "A" друзей. «Что делают твои друзья?»

Например, таблицы:

  • Участники
  • members_gallery
  • members_videos
  • members_friends

Моя проблема в структуре Sql. Я прочитал этот вопрос "Недавние действия пользователей - PHP MySql"

Идея "союза" хороша, но у меня есть альтернатива. Я собираюсь сделать новую таблицу под названием

  • members_activity

Поля:

id | user_id | photo | video | friend | p_id | v_id | f_id | datetime

допустим, пользователь только что загрузил изображение .

id | user_id | photo | video | friend | p_id | v_id | f_id | datetime
1  |   15    |   1   |   0   |    0   | 1203 |   0  |   0  |  NOW()

Преимущества:

  • Когда я делаю ВЫБОР ЗАПРОСА, я легко могу узнать, является ли это фотография, видео или дружеское занятие.
  • Пользователь может удалить «активность фотографии», но сохранить фотографию.
  • Может легко уведомить друзей пользователя.

Недостатки:

  • Огромное количество строк таблицы?

Есть идеи или предложения, как с ними справляются большие сайты? Digg, Facebook и т. д.

Ответы [ 3 ]

8 голосов
/ 19 января 2010

Я думаю, вы правы, что подход с одним столом лучше здесь. Однако одним из недостатков является то, что он плохо масштабируется - что, если вы хотите добавить ссылки или типы комментариев? С этой моделью вам придется добавить еще один столбец для каждого из них. Подход, который я видел в Rails-land, заключается в использовании полиморфной модели, которая будет выглядеть следующим образом:

id | user_id | activity_type_id | p_id | v_id | f_id | datetime

Вы видите, что я заменил видео, фото и т. Д. На activity_type_id. Тогда будет вторая таблица с именем activity_types:

 id | name
----+-------
  1 | photo
  2 | video
  3 | ...

Затем, когда вы создаете запись members_activity, вы можете назначить соответствующую activity_type_id, и если вы хотите создать новые типы действий позже, это будет относительно безболезненно, и вы сможете SELECT конкретный вид деятельности с простым JOIN, например:

SELECT * FROM members_activity
  JOIN activity_types ON members_activity.activity_type_id = activity_types.id
 WHERE activity_types.name = 'photo';
2 голосов
/ 19 января 2010
  • Не понимаю, зачем вам нужен идентификатор друзей. Для страницы друзей вы сначала должны сделать выбор для всех его друзей, а затем выбрать из таблицы активности, где user_id в (2,6,89 и т. Д.)

  • Я бы сделал фото и видео поля одним полем, называемым типом, где фото и видео были бы значениями, так что позже вы сможете добавить больше типов деятельности

  • Я бы сделал p_id и v_id одним столбцом с именем item_id .. нет необходимости в 2 столбцах

  • Я бы добавил дополнительный столбец с именем info, в котором я буду хранить другую информацию в формате json. Это для дополнительных данных, которые есть не у всех событий. Например, у вас может быть событие для добавления ссылки в профиль ... и вы можете разместить ссылку там, поскольку другие события не имеют URL-адресов, и добавление столбца только для этого типа события не будет хорошим решением

2 голосов
/ 19 января 2010

Если у вас огромное количество строк, это не будет практическим недостатком, если правильно проиндексировать таблицу.

По крайней мере, я бы проиндексировал user_id и datetime, предполагая, что вы будете выбирать деятельность для конкретного пользователя и делать заказы по дате.

Используйте MySQL EXPLAIN (<query>), чтобы убедиться, что ваши индексы оптимизированы для часто выполняемых запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...