В общем, это будет работать.
1 - Да, вы должны использовать повторяющийся ключ с уникальной идентификацией в качестве ключа раздела.
- Ключом раздела может быть GUID. Но, возможно, было бы лучше хеш-значение идентификатора пользователя A & B. Тогда вы все равно сможете получить ключ раздела, но хранить его где-либо не обязательно.
- Да, вам все равно понадобится ключ строки, так как это первичный ключ записи. Ключ раздела - это просто группа определенных записей.
- Нет ограничений на ключи разделов - в общем, это должно происходить часто, но тогда должно быть / может быть их тысячи
2 - миллиарды записей по-прежнему будут иметь место, в зависимости от того, как вы решили хранить сообщения чата (хранить каждую строку чата или через каждые x минут или ...). Но я бы все-таки предложил что-то вроде ключа раздела.
SQL Server 2016 и Azure SQL имеют функцию под названием «Индексы хранилища столбцов», которая значительно улучшает запросы и оптимизирует размер данных, записываемых на диск (к сожалению, это доступно только на уровне P1 в Azure)
Рассматривали ли вы использование Cosmos Db - пропускная способность была бы лучше. Это если у вас будет много трафика. Cosmos Db работает очень быстро, и если вы используете секционированные коллекции, у вас будут те же функции и неограниченное пространство для хранения.
Я уверен, что у вас есть веские причины, но немного странно, что вы хотите использовать для этого три разных типа хранилища. Не подойдет ли один тип хранилища (SQL, Azure SQL, хранилище Azure Table, Cosmos Db, ..)?