2015-08-21 2 views
0

Я создаю базу данных для сохранения фотографий от Пользователей и получаю самую популярную фотографию < также за каждый месяц, год> Пример: я создал фотографию A, первую день, я получил 100 симпатий, второй день, у меня 200 симпатий, у меня всего 300 просмотров, поэтому я должен хранить понравившуюся ценность за каждый день. Im думая структуру любит это:Дизайн базы данных «Оценка фотографии»

Table Photo[photo_id, user_id, photo_url] 

Table Day_Rating[id, photo_id, like_count, date] 
//Photo A can have many records in this table 

Table Month_Rating[id, photo_id, like_count, month] //month is: 1,2,3,4..12 
//Photo A can have many records in this table 

Так что, когда пользователь любит фотографию, Мы увеличим на 1 на like_count поле для Day_Rating и Month_Rating таблицы. Так что, чтобы получить ежедневный рейтинг, мы получим наибольшее количество понравившихся с like_count в таблице Day_Rating, то же самое с месячным рейтингом. Что вы думаете об этом подходе? Можете ли вы указать мне лучшую практику, если она будет лучше? Благодаря

+1

Почему бы не просто использовать таблицу Day_Rating и определить месячный рейтинг через выбор с ограничением на дату? Ваша таблица Month_Rating абсолютно избыточна. –

ответ

2

Вы можете сделать все, что вам нужно всего лишь два столов:

photo 
* id 
* posted_by_user_id 
* url 

rating 
* id 
* photo_id 
* rated_by_user_id 
* rated_at 
* rate 

А потом просто пусть движок базы данных сделать агрегаты. Кроме того, хранение каждого рейтинга отдельно позволит вам применять такие правила, как «только один рейтинг для каждого пользователя» и позволит пользователям отменить свои голоса.

+0

Согласен, но я бы не исключил использование таблиц агрегатов целиком. Я бы подумал о том, чтобы добавить их в дополнение к этому позже, если это необходимо, поскольку исторически данные неизменяемы (за исключением случаев, когда фотография удалена, я полагаю). –

+0

Возможно, достаточно индексированного/материализованного представления. Если вы не работаете в масштабе близкого к Facebook, большинство современных RDBMSs будут обрабатывать агрегаты просто отлично. –

+0

Да, это скорее вопрос эффективного ответа: «Покажите мне фотографии с более чем n нравами в день в этом месяце», которые могут быть проиндексированы с помощью правильной совокупности, или «покажите мне фотографии в первой десятке количество понравившихся в неделю ». –

Смежные вопросы