Дизайн базы данных для ежечасного, еженедельного, ранжирования? - PullRequest
0 голосов
/ 20 октября 2011

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

Hourly
- I pull all the posts updated within the last hour, and compare the # of likes/comments compared to my previous entry (the last pull being an hour prior).

Daily
- I pull down all posts within a 24 hours date range.  I compare the # of likes/comments compared to the previous entry. "Post X had 12 more likes and 40 more comments today compared to yesterday"

Weekly
- I pull down all posts within a week's range and do the same as above.  "Post X had no new likes, but 10 more comments added this week compared to last week"

С точки зрения таблиц БД, что было бы хорошим способом справиться с этим?Имеет ли смысл иметь одну гигантскую таблицу с сообщениями (заголовок, comments_previous, comments_current, likes_previous, likes_current и т. Д.)?

Спасибо!

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Столбцы: (PK) отметка времени, (индекс) pageid, count.Установите новую отметку времени каждый час для страниц, которые вам нравятся.Временная метка - это PK, поэтому вы не получите ужасную фрагментацию от своего кластерного макета индекса / страницы в базе данных.

Если вы считаете, что по причинам производительности вам необходимо отменить нормализацию, вы можете делать дополнительные ежедневные иежемесячные таблицы, которые являются свернутыми суммами.Скорее всего, вы сможете эффективно генерировать то, что вам нужно, без сводных таблиц, используя предложения where в комбинации время / подкачка, что дает вам то, что вам нужно, только с одной таблицей.

Очистите старые данные, как высочтите нужным или сохраните его.


Уточнение

Когда комментарий получит лайк, сделайте следующее:

insert into likeRanking (concat(select left(now(),13), '00:00'), commentid, 1)
    on duplicate key update score = score + 1;
0 голосов
/ 20 октября 2011

Я бы сделал это следующим образом:

Создайте таблицу, которая получает время сейчас, комментарии сейчас и лайки сейчас.

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

То же самое с месячным и годовым.

Дайте мне знать, если вам нужно что-нибудь еще.

...