В традиционной архитектуре JSON чат может быть организован следующим образом:
{
"chatrooms" : {
"room1" : {
"room_owner" : "andy_cap",
"room_name" : "cartoon_strips"
},
"room2" : {
...
}
},
"chats" : {
"chat1" : {
"speaker" : "...",
"text" : "...",
"room" : "room1"
},
"chat2" : {
...
}
}
}
Архитектура Firestore отличается, однако, и рекомендует в соответствии с документацией от Google для встраивания чатовв виде подколлекций в чатах.
let messageRef = db
.collection("rooms").document("roomA")
.collection("messages").document("message1")
Выбор Firestore имеет много плюсов и минусов по сравнению со старым вариантом базы данных Firebase Realtime, но архитектура сбора / подсборки потенциально означает проблемы с задержкой и ценообразованием,Похоже, что запрос чата приведет к загрузке полного набора чатов в этой комнате, что на самом деле не то, что нужно при настройке чатов для выбора пользователя.
let docRef = db.collection("rooms").document("roomA")
docRef.getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
print("Document data: \(dataDescription)")
} else {
print("Document does not exist")
}
}
У кого-нибудь есть предложения по управлению этой иерархией?Есть ли способ, например, загружать только данные чата (владелец, имя и т. Д.) В Firestore и использовать более глубокий запрос, если пользователь решит ввести его и прочитать чаты?