Другая реализация с рекурсивным стилем ES6
Array.prototype.cartesian = function(a,...as){
return a ? this.reduce((p,c) => (p.push(...a.cartesian(...as).map(e => as.length ? [c,...e] : [c,e])),p),[])
: this;
};
console.log(JSON.stringify([0,1].cartesian([0,1,2,3], [[0],[1],[2]])));
Создать канал для каждой пары общающихся пользователей. Тогда не будет никакого различия между сообщениями на каналы и сообщениями для пользователей.
Я считаю удобным назвать одноранговые каналы как
[prefix][lesser_user_id][separator][greater_user_id]
Например, канал между пользователями 56789 и 12345 может быть назван chan12345.56789
. В таком случае, когда вам нужно найти соответствующий канал между двумя пользователями, все, что вам нужно в качестве их идентификаторов.
Если ваш приоритет - производительность, перейдите ко второму варианту, а если вас беспокоит размер, перейдите к первому.
В качестве альтернативы, вы можете пойти другим путем: создать одну таблицу в качестве таблицы истории и установить флаг как ложный для столбца «новая запись», а также сбросить все данные, которые уже отправлены в таблицу истории и новые данные (пока быть отправлено) в основной таблице с флагом «Новая запись» = true. Таким образом, вы можете сохранить свой первый подход.