Как организовать хранение лайков и решить вопрос с производительностью в реляционной БД (mysql)?
==================================================================================================

 Есть сущность слово - таблица *words*.  

Некоторые слова могут быть связаны друг с другом (связь - многие ко многим) - таблица *connections*.  

И, наконец, есть таблица *likes* - в нее я планирую записывать лайки/дизлайки пользователей (без регистрации(скорей всего, по IP адресу)).  

Получается, что в таблице *likes* будет храниться ссылка на *id* связи из таблицы *connections*.  
  
**Но есть момент, который не укладывается в голове:**  

Встает проблема с производительностью, если мы храним каждый лайк/дислайк отдельной записью, таблица разрастется до нескольких десятков, а то и сотен, миллионов записей.  

С учетом того, что каждое слово может иметь до 50 коннектов на одной странице, каким образом считать лайки по каждой из связей? Будет ли это критической проблемой производительности? 

 Не хранить каждый лайк индивидуально, а держать два поля счётчиков лайков и дислайков в таблице `connections`. По поступлению лайка инкрементировать поле.  
  

Можно и так, как вы изначально описали. Всё равно скоро придёте к регистрации пользователей, и лайки станут связывать пользователя и лайкнутую связь – придётся их хранить индивидуально.  
  

Проблемы производительности решайте по мере их поступления или чуть заранее, но не так заранее, как сейчас )  
  

Можно установить правило, что лайк можно отменить только в течение, допустим, недели. Тогда нужно хранить индивидуальные записи каждого лайка только неделю, по прошествии которой заменять устаревшие лайки на посчитанную сумму лайков у записи «связи». Так таблица лайков будет держать только свежие лайки, и не разрастётся до миллиардов. 

 Можно денормализовать: хранить и лайки и их количество.  

В connections добавить likes\_count, dislikes\_count  

Создать таблицу connections\_likes (connection\_id, user\_id, like\_type)  

Вместо user\_id может быть IP или что угодно.  

При создании лайка/дизлайка увеличивать счетчик, при удалении - уменьшать. 

 Частичная денормализация базы - кроме таблицы лайков (`user\_id`, `object\_id`) поле `likeCount` хранится ещё в основной таблице и изменяется по триггерам при добавлении/удалении записи в таблице лайков.