Пора подумать Нет SQL с Firebase. Firestore - это база данных в реальном времени, где важна производительность. Ваша структура данных подходит для базы данных SQL, а не для No SQL.
Ниже представлена структура данных, которую я предлагаю для этого варианта использования:
user :
|-> 0000 : //uid
|-> id : '0000'
|-> avatar : 'url'
|-> name : 'josh'
|-> follow : ['1111', '8888'] // Array of uid
|-> 1111 : //uid
|-> id : '1111'
|-> avatar : 'url'
|-> name : 'steve'
|-> follow : ['0000'] // Array of uid
[...]
message :
|-> AAAA // message id
|-> id : 'AAAA'
|-> sender
|-> id: '0000'
|-> avatar: 'url'
|-> name: 'josh'
|-> receiver
|-> id: '8888'
|-> avatar: 'url'
|-> name: 'paul'
|-> time : 1264978800 // timestamp
|-> message : "hello"
|-> BBBB // message id
|-> id : 'BBBB'
|-> sender
|-> id: '8888'
|-> avatar: 'url'
|-> name: 'paul'
|-> receiver
|-> id: '0000'
|-> avatar: 'url'
|-> name: 'josh'
|-> time : 1264978800 // timestamp
|-> message : "hey dude"
|-> CCCC // message id
|-> id : 'CCCC'
|-> sender
|-> id: '0000'
|-> avatar: 'url'
|-> name: 'josh'
|-> receiver
|-> id: '8888'
|-> avatar: 'url'
|-> name: 'paul'
|-> time : 1264978800 // timestamp
|-> message : "How are you"
|-> DDDD // message id
|-> id : 'DDDD'
|-> sender
|-> id: '8888'
|-> avatar: 'url'
|-> name: 'paul'
|-> receiver
|-> id: '0000'
|-> avatar: 'url'
|-> name: 'josh'
|-> time : 1264978800 // timestamp
|-> message : "fine and you?"
Вышеуказанная структура спроектирован способом № SQL. Профили пользователей дублируются несколько раз. Существует дублирование данных для повышения производительности и снижения пропускной способности и затрат ЦП, что намного дороже, чем хранение.
Преимущества:
- Каждый пользователь содержит всю информацию о пользователе
- Каждое сообщение содержит всю информацию о сообщении
Теперь давайте рассмотрим ваши варианты использования:
Если я хочу получить профиль и беседу между 0000 и 8888 (чтобы получить аватар, например), мне нужно:
- проверить, если их друг
- , если да, получить сообщения 0000
- получить сообщения 8888
- получить профиль 0000
- получить профиль 8888
запрос message
где sender
или receiver
находится в follow
.
Если мне нужен список всех разговоров 0000, мне нужно сделать:
- проверить всех пользователей, чтобы узнать, являются ли они друзьями
- для каждого друга, получить профиль
- для каждого друга, получить список сообщений.
Запрос message
где sender
или * 1 056 * равно '0000'
Другие варианты использования, которые могут возникнуть у вас:
- Список друзей с именем и аватаром, которые будут перечислены.
Вы можете использовать массив карты для follow
для хранения uid
, name
и avatar
или даже сделать подписку в качестве подколлекции, если вы собираетесь выполнять с ней несколько операций.
- Пользователь меняет имя или аватар.
Имя или аватар, как правило, меняются реже, чем количество отправленных сообщений, и его изменение в реальном времени может не потребоваться. Вы можете создать облачную функцию для пакетного обновления всех сообщений, если это необходимо для обновления всех сообщений
Сказав все это, очевидно, что ваш выбор - использовать SQL или Нет SQL. У обоих есть свои достоинства и недостатки