Сообщенька в базе - это бинарный «документ» (лежащий в чём-то типа mongoDB или типа redis, в общем неком key=value), про который известны оффсеты до всех полей. Совершенно аналогично «туплу», который «строка» в «традиционных» табличных СУБД. В общем, сообщенька - это, можно сказать, строка в БД, в которой можно так же апдейтить/инкрементить отдельные произвольные «поля»/«колонки». В общем, скажем для простоты, что это «обычная строка в обычной БД».
У сообщеньки есть 8-битная поле/колонка - likes. Там лежит либо 0, либо 1.
Есть отдельные «микросервис» лайков - совершенно отдельная «субд», заточенная под хранение лайков - она хранит key=set, где key идентифирует пролайканный объект, тип лайка. Таким образом, можно понять сколько у этого объекта лайков, лайкал ли ты (данный uid) уже эту сущность, и автоматически не дать тебе что-то лайкнуть 2 раза.
Лайки - это частный случай реакции, реакция типа ноль. Например, если uid=123 лайкнул сообщеньку номер 10000 в чатике «zuzu», то uid=123 поставил реакцию типа ноль и в микросервисе лайков мы увидим ключ: zuzu:10000:0
в котором лежит set
и в этом set
мы обнаружим 123
среди прочих.
Теперь прикол в том, что показывая каждую сообщеньку, я не хочу ходить в микросервис лайков, выясняя есть ли для данной сообщеньки там ключ. Поэтому я умный и ставлю единичку в поле likes
в сообщеньке, если был замечен хоть один факт лайков. Поле likes
означает стоит ли ходить в микросервис лайков, выясняя сколько лайков у этой сообщеньки и лайкал ли ты её. Это сильно облегчает жизнь.
Теперь непонятно, как в сообщеньке таким же образом (как поле likes
) закешировать инфу о том, что этой мессаге поставили не только лайк, но ещё и «огонь» и ещё «палец вверх».
Превратить likes
в битовую маску - жопа, т.к. заранее неизвестно, сколько разных реакций возможно.
Есть идеи, как грамотно кешировать в самой строке сообщенки инфу о том, какие разные реакции у этой сообщеньки в принципе есть? Пока что приходит в голову только массивчик бинарных 16-битных чиселок, где каждое число означает, что реакция соответствующего типа вообще у этой сообщеньки хоть раз встречалась. Соответственно, когда какую-то реакцию кто-то ставит впервые, мы достаём этот массивчик, дописываем к концу новое число и сохраняем в мессагу обратно - но это некоторая жепь-ебрилло, поскольку подразумевает полный апдейт всей мессаги, ибо строка имеет переменный размер. Хранить в конце документа-бла-бла - не круто, т.к. где у него конец мы не знаем, ибо в сообщеньке есть ещё и текст переменной длины.
Ну или можно такой «массивчик», хотя на самом деле отдельный key=set
хранить отдельно. Т.е. колонка likes
говорит, что реакции в принципе были, далее уже достаём этот key=set
и смотрим какие именно были.