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? 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.
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