Эта таблица - небольшой бонус, с помощью которого мы сможем определять позицию любого фото в рейтинге. Так так у нас рейтинг имеет жесткие рамки от 1 до 5 с точностью 0,0001, то можно сделать небольшую таблицу к которой будем просто указывать количество фото для каждого рейтинга, максимум строк будет 4000, и работать с ней будет гораздо проще.
Да, такая вот маленькая таблица, в первой колонке рейтинг, а во второй - количество фото с таким рейтингом, соответсвенно, что бы определить позицию любого фото, достаточно сделать запрос:
Правда, со временем возможны расхождения количество фото и рейтинга, так как все-таки не рейтинг не именованный, поэтому данную таблицу периодически прийдется обновлять, но на уровне прокси, к данной операции обратимся позднее.
Таблица ТОП Фото
В этой таблице хранятся топовые фото нашего проекта, структура её проста: ID фото, хеш пользователя фото по которую определяем хранилище , собственно, рейтинг, и старый рейтинг, что бы мы могли легко определить его изменение.
Я принципиально не включаю проверку на ограничение количества записей таблицы, потому что:
Запрос COUNT(*) довольно дорогой, что бы его делать каждый раз во время вставки;
При резком понижении рейтинга фото, когда по идее оно должно выпасть из ТОПа, оно будет сваливаться только лишь в самый низ списка, а фото у которых рейтинг выше, в него так и не попадут;
При удалении фото, таблица рейтига у нас уменьшится и список будет не полным;
Поэтому создадим небольшую хранимую процедуру очистки таблицы, для периодического запуска по cron:
Остальные операции изменения определим позднее.
Таблица последних Фото
В этой таблице хранятся последние фото нашего проекта, структура её так же проста: ID фото, хеш пользователя фото по которую определяем хранилище и дата загрузки.
Триггеры тоже не нужны. А вот хранимая процедура для чистки таблицы - да:
Один в один, как и для предыдущей таблицы.
Таблица тегов
Прямая плоская таблица без изысков.
Сам хеш от тега будем считать на уровне прокси, поэтому не заморачиваемся с тем, что к нам пришло.
Точки входа для изменений данных
Известно, что этот сервер будет общаться только с проксирующим сервером. Таблица последних фото у нас одна, для понятия "дата добавления" и ничего общего с другими таблицами у нее нет, так же и таблица тегов, поэтому прокси сервер будет работать напрямую с ней, а вот с рейтингом сложнее...
У нас 2 таблицы с рейтингом, первая (index_rating_foto) не именованная, то есть, не имеет непосредтвенных связей с объектами, а вторая (index_top_foto), хоть и именованная, но не полная, то есть в ней не перечислены все связи, поэтому любую из этих таблиц нельзя использовать как точку входа. Вариант, когда мы будем с прокси сервера последовательно обращаться к таблицам рейтинга, я даже не рассматриваю, во первых - слишком много запросов по сети, во-вторых сложнее соблюдать целостность данных и использовать транзации. Для этого сделаем хранимую процедуру, как общую точку входа для таблиц с рейтингами:
Штатные вызовы будут такими:
На этом с индексной базой данных закончим. Берем разпределенную базу: