Активность пользователей (ala facebook) БД подход. Большой JOIN или несколько простых запросов? - PullRequest
4 голосов
/ 06 ноября 2010

Мне нужно отобразить последние действия пользователей на сайте. Отправленные обзоры, загруженные изображения / видео, проголосовавшие статьи и так далее ...

У меня есть две таблицы:

' user_activity ' таблица со столбцами «userID», «datetime», «ActivityID» и «externalID».

' деятельность ' таблица с 'ActivityID' и 'активность'.

Допустим, что 'activityID' = 4, тогда я знаю, что он снова ссылается на загруженное видео (просматривая таблицу «действий»), тогда я также знаю, что externalID ссылается на «videoID» из третьей таблицы под названием « видео.

То же самое для каждого вида деятельности, если его обзор, то externalID снова ссылается на "reviewID" в таблице "обзоры".

При отображении активности пользователя я хочу не только сказать, что пользователь загрузил изображение, но также показать загруженное изображение или видео или что-то еще.

Итак,

При запросе последнего действия пользователя я могу получить данные двумя способами:

1) Получите данные из таблицы 'user_activity', а затем сделайте еще один запрос для каждой строки во внешнюю таблицу (обзоры, видео, изображения ...) в зависимости от 'activityID'.

2) Создайте большое ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ из всех таблиц (user_activity, обзоры, видео, изображения ...) вместе, а затем используйте только соответствующий столбец на основе 'activityID'.

Таким образом, способ 1 вызовет МНОГО запросов к БД, потому что мне нужен отдельный запрос для каждой строки активности. И путь 2 приведет к БОЛЬШОМУ СОЕДИНЕНИЮ.

Любые полезные советы по PROS CONS и методам лучше ??

Ответы [ 2 ]

2 голосов
/ 06 ноября 2010

Нет.

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

0 голосов
/ 06 ноября 2010

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

Чтобы ответить на ваш вопрос более конкретно: это зависит. Соединения могут быть проще в базе данных, если вы настроите таблицы для использования InnoDB, и вы будете объединять только внешние ключи. К сожалению, InnoDB не поддерживает полиморфные внешние ключи.

Вообще говоря, масштабировать базу данных сложнее, чем масштабировать ваше приложение, поэтому все, что вы можете сделать, чтобы переместить работу с уровня БД на уровень приложения, - это хорошо. Тем не менее, это действительно так, если вы беспокоитесь о масштабировании (и помните, преждевременная оптимизация может быть смертельным ударом для стартапа).

Ознакомьтесь с основными ответами на этот вопрос в Quora для получения более подробной информации: Какие проблемы масштабирования следует учитывать при разработке канала социальной сети?

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