Schemat MongoDB dla wielu kont użytkowników auth

Zaraz zbuduję swój węzeł.js / express / Mangusta / Aplikacja passport i zastanawiam się nad właściwym projektem schematu dla użytkowników i kont.

Użytkownicy będą logować się z Twittera i facebook, a także z rodzimych kont. Na późniejszym etapie chcę, aby użytkownik połączył zarówno twitter i facebook z moją aplikacją (a może nawet więcej zewnętrznych kont).

Nie mogę wymyślić dobrego rozwiązania dla tej sytuacji. Proszę. są to Opcje, o których myślę:

1.Posiadanie modelu profilu i modeli kont. Dokumenty profilu reprezentują unikalnego użytkownika, podczas gdy konto zawiera nazwę użytkownika i hasło (konto wewnętrzne) lub dane uwierzytelniające od dostawcy autoryzacji (konto zewnętrzne). Profil musi mieć co najmniej jeden zagnieżdżony dokument konta.

var ExtAccountSchema = new Schema({
    type: String, // eg. twitter, facebook, native
    uid: String
});

var IntAccountSchema = new Schema({
    username: String,
    password: String
});

var ProfileSchema = new Schema({
    firstname: String,
    lastname: String,
    email: String,
    accounts: [Account] // Pushing all the accounts in there
});

To, czego nie lubię, to nie tak spójne dokumenty konta wynikające z różnych danych konta i fakt, że mam trudno znaleźć odpowiednie konto, gdy mój użytkownik loguje się (wyszukiwanie UID i typów kont w zagnieżdżonych dokumentach -.-)

2.Posiadanie wszystkich danych w jednym modelu

var ProfileSchema = new Schema({
    firstname: String,
    lastname: String,
    email: String,        
    twitter-uid: String,
    facebook-uid: String
    password: String
});
To jest po prostu brzydkie.- Może być łatwiej/szybciej znaleźć odpowiednie dane konta, ale to nie jest miłe w utrzymaniu. Czy jest lepsze rozwiązanie? Czy istnieje najlepsza praktyka?
Author: Cœur, 2012-06-19

1 answers

1) Istnieją trzy strategie, które możesz zastosować, aby uporządkować swoje dane w MongoDB:

  • a) tablica wbudowanych dokumentów
  • b) tablica osadzonych referencji
  • c) Rozszerzony do dokumentu nadrzędnego

Strategia (a) to pierwsza opisana strategia, w której dokument profilu zawiera tablicę pod-dokumentów kont.

Strategia (b) jest podobna do strategii (a) , ale można użyć tablicy odniesień do innych dokumentów (zazwyczaj w Koncie kolekcji) zamiast osadzania rzeczywistych dokumentów.

Strategia (c) to ta, którą opisujesz jako "posiadanie wszystkich danych w jednym modelu".

2) Powszechnie uważa się, że najlepszą praktyką jest używanie tablicy osadzonych dokumentów, zwłaszcza jeśli informacje w nich mogą się różnić. Jeśli to ułatwi Ci życie, możesz użyć klucza, aby odróżnić typ konta, jak TAK:

  { 
    firstname: 'Fred',
    lastname: 'Rogers',
    email: '[email protected]',

    accounts: [
             { kind: 'facebook',
               uid: 'fred.rogers'
             },
             { kind: 'internal',
               username: 'frogers',
               password: '5d41402abc4b2a76b9719d911017c592'
             },
             { kind: 'twitter',
               uid: 'fredr'
             }
          ]
    }

3) MongoDB umożliwia wyszukiwanie osadzonego dokumentu. Więc można napisać następujące zapytanie (Składnia JavaScript):

 db.profile.find( 
        { email: '[email protected]', 'accounts.kind': 'facebook' }
        );

Z odpowiednimi indeksami, to zapytanie będzie dość szybkie.

 42
Author: William Z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-04 04:59:31