J'ai vu votre question, un peu plus tard, mais je vais aussi essayer de vous fournir la meilleure structure de base de données je pense. Donc espérons que vous trouverez cette réponse utile.
Je suis en train de penser à un schéma qu'il y a trois niveau supérieur collections users
, users that a user is following
et posts
:
Firestore-root
|
--- users (collection)
| |
| --- uid (documents)
| |
| --- name: "User Name"
| |
| --- email: "email@email.com"
|
--- following (collection)
| |
| --- uid (document)
| |
| --- userFollowing (collection)
| |
| --- uid (documents)
| |
| --- uid (documents)
|
--- posts (collection)
|
--- uid (documents)
|
--- userPosts (collection)
|
--- postId (documents)
| |
| --- title: "Post Title"
| |
| --- date: September 03, 2018 at 6:16:58 PM UTC+3
|
--- postId (documents)
|
--- title: "Post Title"
|
--- date: September 03, 2018 at 6:16:58 PM UTC+3
si quelqu'un avoir de 10 000 followers qu'un nouveau poste a été ajouté à tous les 10 000 adepte de Montage.
Qui ne sera pas du tout un problème parce que c'est la raison pour laquelle les collections sont ment dans Firestore. Selon la documentation officielle de la modélisation d'un Nuage Firestore base de données:
Cloud Firestore est optimisé pour le stockage de grandes collections de documents de petite taille.
C'est la raison pour laquelle j'ai ajouté userFollowing
comme un ensemble et non comme un simple objet/map qui peut contenir d'autres objets. Rappelez-vous, la taille maximale d'un document selon la documentation officielle concernant les limites de quotas et de est - 1 MiB (1,048,576 bytes)
. Dans le cas de la collecte, il n'y a pas de limitation concernant le nombre de documents sous forme de collection. En fait, pour ce genre de structures est Firestore optimisé pour.
Donc le fait de les avoir 10.000 adeptes de cette manière, fonctionne parfaitement bien. En outre, vous pouvez interroger la base de données de telle manière à ne pas être nécessaire de copier quoi que ce soit n'importe où.
Comme vous pouvez le voir, la base de données est assez bien dénormalisée vous permettant de faire des requêtes très simples. Prenons un exemple, mais avant nous allons créer une connexion à la base de données et obtenir l' uid
de l'utilisateur en utilisant les lignes de code suivantes:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
Si vous souhaitez interroger la base de données pour obtenir tous les utilisateurs un utilisateur est la suivante, vous pouvez utiliser un get()
appel sur la référence suivante:
CollectionReference userFollowingRef = rootRef.collection("following/" + uid + "/userFollowing");
Donc, dans cette façon, vous pouvez obtenir tous les objets utilisateur d'un utilisateur est la suivante. Ayant leur uid vous pouvez simplement obtenir tous leurs posts.
Disons que vous souhaitez obtenir sur votre timeline les trois derniers messages de chaque utilisateur. La clé pour résoudre ce problème, lors de l'utilisation de très grands ensembles de données est de charger les données en segments plus petits. Je l'ai expliqué dans ma réponse de ce post un recommandé de la façon dont vous pouvez paginer les requêtes en combinant requête curseurs avec l' limit()
méthode. Je vous recommandons également de prendre un coup d'oeil à cette vidéo pour une meilleure compréhension. Donc, pour obtenir les trois derniers messages de tous les utilisateurs, vous devriez envisager d'utiliser cette solution. Donc, vous devez d'abord obtenir les 15 premiers objets utilisateur que vous suivez et puis, sur la base de leur uid
, pour obtenir leur dernière création de trois postes. Pour obtenir la dernière création de trois postes d'un seul utilisateur, veuillez utiliser la requête suivante:
Query query = rootRef.collection("posts/" + uid + "/userPosts").orderBy("date", Query.Direction.DESCENDING)).limit(3);
Comme vous le défilement vers le bas, charge 15 autres objets utilisateur et d'obtenir leur dernière création de trois postes et ainsi de suite. À côté de l' date
vous pouvez également ajouter d'autres propriétés de votre post
objet, comme le nombre de likes, commentaires, partages et ainsi de suite.
Si quelqu'un a grande quantité de messages que chaque nouvel adepte reçu tous ces messages dans son Calendrier.
Aucun moyen. Il n'est pas nécessaire de faire quelque chose comme ça. J'ai déjà expliqué plus haut pourquoi.
Modifier Le 20 Mai 2019:
Une autre solution pour optimiser le fonctionnement dans lequel l'utilisateur doit voir tous les messages récents de tout le monde, il les a suivi, est de stocker les messages que l'utilisateur doit voir dans un document de l'utilisateur.
Donc, si nous prenons un exemple, disons que facebook, vous aurez besoin d'avoir un document contenant le facebook de l'alimentation pour chaque utilisateur. Cependant, si il y a trop de données qu'un seul document peut contenir (1 Mib), vous avez besoin de mettre les données dans une collection, comme expliqué ci-dessus.