ejercicios - Diseño de esquema MongoDB para múltiples cuentas de usuario de autenticación
mecanismos de autenticación mongodb (1)
1) Hay tres estrategias que puede tomar para estructurar sus datos en MongoDB:
- a) Matriz de documentos incrustados
- b) Matriz de referencias incrustadas
- c) Ampliado en el documento principal
La estrategia (a) es la primera que describes, donde el documento de perfil contiene una matriz de sub-documentos de cuenta.
La estrategia (b) es similar a la estrategia (a), pero utilizaría una serie de referencias a otros documentos (generalmente en una colección de Cuentas) en lugar de incorporar los documentos reales.
La estrategia (c) es la que usted describe como "tener todos los datos en un solo modelo".
2) En general, se considera Mejor práctica para usar una matriz de documentos integrados, especialmente si la información que contienen puede variar. Si te hará la vida más fácil, puedes usar una clave para distinguir el tipo de cuenta, así:
{
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 le permite buscar en un documento incrustado. Entonces, escribiría la siguiente consulta (sintaxis de JavaScript):
db.profile.find(
{ email: ''[email protected]'', ''accounts.kind'': ''facebook'' }
);
Con los índices apropiados, esta consulta será bastante rápida.
Estoy por construir mi aplicación node.js / express / mongoose / pasaporte y estoy pensando en el diseño de esquema correcto para los usuarios y las cuentas.
Habrá usuarios accediendo desde Twitter y Facebook, así como desde cuentas nativas. En una etapa posterior, quiero que un usuario conecte Twitter y Facebook con mi aplicación (y tal vez incluso con más cuentas externas).
No puedo pensar en una buena solución para esa situación. Estas son las opciones en las que estoy pensando:
1. Tener un modelo de perfil y modelos de cuenta. Los documentos de perfil representan el usuario único, mientras que una cuenta proporciona nombre de usuario y contraseña (cuenta interna) o los datos de autenticación del proveedor de autenticación (cuenta externa). Un perfil debe tener al menos un documento de cuenta anidado .
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
});
Lo que no me gusta son los documentos de cuenta no tan consistentes que provienen de diferentes datos de cuenta y el hecho de que me resulta difícil encontrar la cuenta correcta cuando mi usuario inicia sesión (búsqueda de uids y tipos de cuenta en documentos anidados -.-)
2. Tener todos los datos en un solo modelo
var ProfileSchema = new Schema({
firstname: String,
lastname: String,
email: String,
twitter-uid: String,
facebook-uid: String
password: String
});
Bueno, esto es feo-.Puede ser más fácil / más rápido encontrar los datos correctos de la cuenta, pero no es agradable de mantener.
¿Hay una mejor solución? ¿Hay una mejor práctica?