2016-07-29 10 views
7

Natürlich haben die Benutzer in meiner Datenbank Informationen, die öffentlich zugänglich sein können und andere Informationen, die nur sie sehen sollten. Ich denke über zwei verschiedene Möglichkeiten nach, dies zu implementieren.Firebase: Wie man öffentliche/private Benutzerdaten strukturiert

Option 1: Haben /users/$uid lesbar nur durch den Benutzer und haben /users/$uid/profile von jedermann lesbar sein.

Option 2: Halten /users/$uid lesbar nur durch den Benutzer und haben ein /profiles/$uid, die öffentlich ist. Dies folgt der Empfehlung für eine flachere Datenstruktur, aber ich sehe nicht, wie es in diesem Fall besser ist.

Antwort

12

Der einfachste Weg, um zu sehen, warum die "flacher" Struktur besser ist, ist zu sehen, wie Sie es sichern und wie Sie dann Funktionalität implementieren würden.

Ihre erste Struktur ist:

users: { 
    uidOfJacob: { 
    stackId: 884522, 
    ssn: "999-99-9999", 
    profile: { 
     displayName: "Jacob Philips" 
    } 

    }, 
    uidOfPuf: { 
    stackId: 209103, 
    ssn: "999-99-9999", 
    profile: { 
     displayName: "Frank van Puffelen" 
    } 
    } 
} 

Sie sichern würde es mit:

{ 
    "rules": { 
    "users": { 
     "$uid": { 
     ".read": "auth.uid == $uid", 
     ".write": "auth.uid == $uid" 
     "profile": { 
      ".read": true 
     } 
     } 
    } 
    } 
} 

Einer der Hauptgründe für die Information der Öffentlichkeit, die in der Lage sein, eine Liste dieser Informationen anzuzeigen . In JavaScript:

ref.child('users').child(???).child('profile').on('child_added'... 

Das wird nicht funktionieren, weil das, was wir tun in ??? setzen. Firebase-Vorgänge müssen in der Lage sein, die gesamte Liste von einem Standort aus zu lesen, und der Benutzer muss über Leseberechtigung für den gesamten Standort (nicht nur für die einzelnen untergeordneten Knoten) verfügen.

Wenn wir die Datenstruktur, die Öffentlichkeit Informationen aus dem privaten Informationen zu trennen, erhalten wir:

users: { 
    uidOfJacob: { 
    stackId: 884522, 
    ssn: "999-99-9999", 
    profile: { 
     displayName: "Jacob Philips" 
    } 

    }, 
    uidOfPuf: { 
    stackId: 209103, 
    ssn: "999-99-9999", 
    profile: { 
     displayName: "Frank van Puffelen" 
    } 
    } 
}, 
"profile": { 
    uidOfJacob: { 
    displayName: "Jacob Philips" 
    }, 
    uidOfPuf: { 
    displayName: "Frank van Puffelen" 
    } 
} 

Sie sichern würde es mit:

{ 
    "rules": { 
    "users": { 
     "$uid": { 
     ".read": "auth.uid == $uid", 
     ".write": "auth.uid == $uid" 
     } 
    }, 
    "profiles": { 
     ".read": true, 
     "$uid": { 
     ".write": "auth.uid == $uid" 
     } 
    } 
    } 
} 

keine Liste der bekommen öffentliche Benutzerprofile, würden Sie tun:

ref.child('profiles').on('child_added'... 

Dies wird funktionieren, weil jeder Leseberechtigung hat o n profiles.

+0

Mein aktueller Anwendungsfall ist es, Profilinformationen zu betrachten, wenn die Benutzer-ID bereits bekannt ist, weshalb ich Schwierigkeiten hatte, die Unterschiede zu sehen. Der verschachtelte Ansatz verhindert das Abrufen einer Liste von Profilen, die später wahrscheinlich nützlich sein wird. –

+0

Dies bedeutet im Grunde, dass neue Benutzer nach der Registrierung zweimal in der Datenbank schreiben müssen: 1. neuer Eintrag für den Knoten "users" (uid mit seinen Unterknoten), 2. neuer Eintrag für den Knoten "profile" (uid mit dem Unterknoten displayName) ? @FrankVanPuffelen – Ewoks

+2

@Ewoks Ja, das ist richtig. Franks Ansatz ist im NoSQL-Datenbankentwurf üblich, bei dem die Leseleistung auf Kosten der Verringerung der Schreibleistung verbessert wird. –

Verwandte Themen