0

Je viens de commencer à utiliser firebase pour créer ma première application de chat (réagissez native). Je suis cependant légèrement confus au sujet de la structure idéale que ma base de données devrait avoir. Les documentations Firebase suggèrent que la structure devrait être aussi normalisée que possible, mais le type de requêtes auxquelles j'ai accès pour donner l'impression que la normalisation des données aurait un impact sur les performances.Conseils sur la structure de base de données d'une application de discussion de base de feu

Juste un exemple rapide qui convient à mon cas d'utilisation: Mon rapide, la structure dénormaliser serait:

{ 
    "workgroups": { 
    "40": { 
     "id": "40", 
     "name": "workgroup 1 name", 
     "messages": { 
     "message-1-id": { 
      "id": "message-1-id", 
      "text": "Message 1 text", 
      "user": { 
      "id": "1", 
      "name": "User 1 name", 
      "avatar": "http://user1avatar.com" 
      } 
     }, 
     "message-2-id": { 
      "id": "message-2-id", 
      "text": "Message 2 text", 
      "user": { 
      "id": "1", 
      "name": "User 1 name", 
      "avatar": "http://user1avatar.com" 
      } 
     } 
     } 
    } 
    } 
} 

L'inconvénient évident étant que si un utilisateur change son avatar seulement les nouveaux messages afficher.

Ma structure normalisée serait:

{ 
    "workgroups": { 
    "40": { 
     "id": "40", 
     "name": "workgroup 1 name", 
     "messages": { 
     "message-1-id": { 
      "id": "message-1-id", 
      "text": "Message 1 text", 
      "user": "1" 
     }, 
     "message-2-id": { 
      "id": "message-2-id", 
      "text": "Message 2 text", 
      "user": "1" 
     } 
     } 
    } 
    }, 
    "users": { 
    "1": { 
     "id": "1", 
     "name": "User 1 name", 
     "avatar": "http://user1avatar.com" 
    }, 
    "2": { 
     "id": "2", 
     "name": "User 2 name", 
     "avatar": "http://user2avatar.com" 
    } 
    } 
} 

je dois chercher tous les messages pour un certain endroit et chaque message aurait besoin d'avoir l'avatar de l'expéditeur et le nom qui lui est connecté. La structure dénormalisée est-elle toujours la meilleure option?

Si la structure normalisée serait encore préférée alors comment devrais-je joindre les tables? Ma première tentative a été d'aller chercher tous les messages dans un endroit, puis d'aller chercher chaque utilisateur pour chaque message mais je doute que ce soit la meilleure solution.

Merci pour votre aide!

+0

Peut-être pas la réponse que vous cherchez, mais je vous suggère de faire quelques courtes expériences à testez vos cas d'utilisation. J'ai restructuré mes données plusieurs fois avant de trouver une approche qui fonctionne pour moi, mais tester et expérimenter est le meilleur moyen de savoir si vous avez des goulots d'étranglement. De plus, une fois que vous avez une structure avec laquelle vous pouvez travailler, n'oubliez pas de créer des index pour les éléments que vous voulez interroger. Et si vous envisagez d'ajouter des règles de sécurité plus tard, faites quelques premières expériences pour comprendre comment cela affectera vos données/requêtes. Bonne chance! – Peter

+0

Oui, je vais certainement faire quelques expériences avant de construire autour d'une structure définie. Il vaut mieux mieux le planifier que de continuer à le changer. Merci – WiserTheBassist

Répondre

0

Il est impossible de dire quelle est la meilleure approche étant donné que nous ne connaissons pas la fin du jeu de votre application. Aurez-vous besoin de rechercher des messages, des utilisateurs, etc.? Voulez-vous répertorier les utilisateurs?

Puisque vous mentionner:

« si un utilisateur change son avatar seulement les nouveaux messages afficher »

vous avez déjà vous avez répondu propre question, je pense. Vous devez normaliser les données afin que les messages et les utilisateurs soient séparés. Firebase n'est pas un DB relationnel, donc vous ne rejoindrez aucune table. Vous interrogez les messages. Une fois que vous obtenez le premier message, vous pouvez commencer à interroger les utilisateurs à partir de l'identifiant de l'utilisateur dans le message. Vous finirez par interroger une fois pour les messages et une requête pour chaque utilisateur dont vous avez besoin. Vous pouvez être intelligent dans l'interrogation des utilisateurs et interroger uniquement les utilisateurs si vous ne les avez pas déjà interrogés.

Vous pouvez consulter this short video sur la façon de faire « adhérer » à Firebase par opposition à la façon dont vous le feriez dans SQL

+0

Pour répondre à vos questions, mon but ici est de construire une conversation simple qui aura aussi des images et des vidéos.Chaque groupe de discussion/groupe de travail a plusieurs utilisateurs, mais aucune recherche ou liste d'utilisateurs n'est requise. Donc, d'après ce que je comprends de votre réponse, je devrais hiérarchiser la structure de données normalisée sur la structure dénormalisée et plutôt travailler sur la recherche d'une méthode efficace pour accéder à l'expéditeur d'un message à travers une autre requête. Et oui, je garderais une liste de tous les utilisateurs récupérés dans mon état et ne récupèrerais un objet utilisateur que s'il n'avait pas été récupéré auparavant. Merci beaucoup! – WiserTheBassist

+0

Oui, optez pour des données normalisées dans ce cas. Ps. n'utilisez pas la base de données Firebase pour stocker des images/vidéos. Jetez plutôt un coup d'œil au stockage Firebase. Ensuite, faites un lien vers le chemin de stockage à partir de votre jeu de données (c'est-à-dire encore plus de requêtes, mais vous obtenez d'autres avantages). – Peter