Вы можете разделить большие разделы на несколько разделов, используя консистентное хеширование для части ключа раздела:
CREATE TABLE songs_listenings (
user_id int,
song_hash int,
song text,
listen_date date,
PRIMARY KEY (( user_id, song_hash ), song)
);
song_hash
- это хеш, который генерируется на основе текста песни. Чтобы сгенерировать этот хеш, вам нужно внедрить в ваше приложение функцию согласованного хеширования, которая предоставит возможность генерировать некоторое число в указанном диапазоне (максимальное количество разделов, которое вы хотите иметь для одного пользователя) для указанного входного параметра (текст песни) , (Например, Java-библиотека Guava обеспечивает согласованную функцию хеширования )
Для случая с несколькими прослушиваниями одной и той же песни непротиворечивый хэш будет возвращать один и тот же номер, поэтому это будет тот же ключ разделения, и у вас будет только одна запись для одной и той же песни на пользователя.
Но из-за того, что у вас будет несколько разделов на пользователя, вам придется выполнить несколько запросов, чтобы получить все данные для пользователя (перебрать все возможные значения хеша).