¿Cuáles son las mejores prácticas recomendadas para un esquema MongoDB/Mongoose para almacenar grandes cantidades de datos de usuario de manera segura?
Cada modelo de Usuario necesita los campos habituales (nombre, email, etc) y cada usuario puede tener un gran número de registros de Contenido asociados. (Se trata de una aplicación para tomar notas como Evernote). Cada documento de contenido necesita los metadatos habituales, como la fecha de creación y actualización, así como el contenido del texto (asunto, cuerpo) y quizás archivos adjuntos binarios (que, por el bien de esta pregunta, podemos suponer que serán almacenarse fuera de la base de datos, por lo que solo necesitamos almacenar un localizador de archivos). El cuerpo del texto podría ser bastante grande.
Idealmente, el Contenido de cada usuario se almacena en una ubicación separada de los datos de cualquier otro usuario. Quiero evitar cualquier posibilidad de que un simple error en una consulta de la base de datos pueda exponer el contenido del usuario a otro. Además, cuando un usuario desea que se eliminen sus datos, debemos asegurarnos de que se eliminen todos sus datos y solo sus datos. Además, algún día los datos deberán ser fragmentados por el usuario. Creo que esto significa que el contenido de cada usuario debe estar en un Documento o Colección por separado.
La opción 1, por referencia, no logra estos objetivos, pero es el ejemplo más común que he visto:
var mongoose = require('mongoose'); var UserSchema = new mongoose.Schema({ email: { type: String, required: true }, name: { given: String, family: String }, content: [{ type: Schema.Types.ObjectId, ref: 'Content' }], ... }); var ContentSchema = new mongoose.Schema({ _id: Number, subject: String, encryptedBody: String, ... }); module.exports = mongoose.model('User', UserSchema); module.exports = mongoose.model('Content', ContentSchema);Opción 2, incrustar el contenido en el esquema de usuario
var mongoose = require('mongoose'); var UserSchema = new mongoose.Schema({ email: { type: String, required: true }, name: { given: String, family: String }, ... content : [{ subject: String, encryptedBody: String, ... }] }); module.exports = mongoose.model('User', UserSchema); ¿Hay otra manera?
¿Es uno mejor que el otro en cuanto a rendimiento? (Suponga que las lecturas pesan mucho más que la cantidad de escrituras). ¿Alguna idea sobre la indexación del campo Asunto del contenido? Gracias de antemano por sus pensamientos.