Skip to content

Ru:TaggableSmartHandler

AlexeyDsov edited this page Apr 15, 2012 · 6 revisions

TaggableDaoWorker + TaggableSegmentHandler

Пока проще всего получилось описать работу этих классов на примерах.

Пусть у нас будут две таблички и соотвествующие бизнес объекты - User и City (таблицы users и cities). Каждый из пользователей имеет обязательное свойство city ссылающееся на город. У этих таблиц могут быть еще дополнительные поля но заранее, думаю, описывать их не имеет смысла, они будут носить эпизодический характер в примерах.


Если мы хотим получить список всех пользователей, то делаем запрос вида SELECT * FROM users; При этом единственный тэг который можно привязать к такому запросу - это тег с названием таблицы. При этом при изменении любого пользователя запросы по этому тэгу должны раскешиваться.
Тоже самое касается и запросов SELECT * FROM users WHERE users.name = 'Ivan' или, например, ... WHERE users.birthday IS NOT NULL. Все эти запросы привязываются к единственному тегу на основе названия таблицы users.

Если нужно искать пользователей которые живут в конкретном городе SELECT * FROM users WHERE city_id = 33, то запрос будет привязан к тегу "cities|33". Почему такой запрос повешенный на тэг из другой таблицы будет актуален (или что нужно делать что бы он был актуален)?

Например, мы обновляем пользователя (c id=55) у которого city_id = 33. В таком случае необходимо обновить следующие теги:

  • тег users|55 (т.е. раскешиваем самого пользователя)
  • тег users (нужно сделать неактуальными все общие запросы)
  • теги связанных объектов на которые ссылается текущий, в данном случае cities|33
  • если у пользователя меняется само свойство city_id, то нужно раскешить как тэг старого города так и нового

Т.к. в списке тегов для раскешивания гарантированно есть cities|33, то подобного запрос будет всегда актуален при измении пользователя. Тоже самое касается и обновления города. Как только мы изменяем город 33, то раскешиваются запросы с тегом cities|33 и запрос сохранит актуальность при изменении города.


Если попадаются сложные запрос с JOIN'ами, то тэги создаются по названию таблиц, т.к. запрос вида SELECT * FROM users JOIN cities ON cities.id = users.city_id WHERE cities.name = 'Moscow' будет бесхитростно повешен на два тега cities и users. При измении/добавлении записей в любой из этих таблиц следующий такой запрос будет браться из базы.

Clone this wiki locally