Enregistrement d'objets imbriqués dans mangouste
Venant de PHP/MySQL fond, j'ai du mal avec les meilleures pratiques en termes de structuration et de sauver mes données.
Je suis en train de créer une petite application où je peux ajouter des recettes avec de multiples ingrédients. J'ai un tas de pré-rempli ingrédients comme de la graine de données, le schéma qui ressemble à:
var IngredientSchema = new Schema({
name: {
type: String,
trim: true,
required: true,
index: {
unique: true
}
},
created: {
type: Date,
default: Date.now
}
});
var Ingredient = mongoose.model('Ingredient', IngredientSchema);
Une recette actuellement ressemble à ceci:
var RecipeSchema = new Schema({
name: {
type: String,
trim: true
},
ingredients: [
{
type: Schema.Types.ObjectId,
ref: 'RecipeIngredient'
}
],
created: {
type: Date,
default: Date.now
}
});
var Recipe = mongoose.model('Recipe', RecipeSchema);
Enfin, j'ai un RecipeIngredientSchema. Maintenant, c'est là que mon MySQL arrière-plan peut être rampant dans; la raison pour laquelle je l'ai fait de cette façon est parce que je veux le "un à plusieurs" de la relation entre les Recettes et les Ingrédients, mais je veux aussi être capable de spécifier une unité:
var RecipeIngredientSchema = new Schema({
recipe: {
type: Schema.Types.ObjectId,
ref: 'Recipe'
},
ingredient: {
type: Schema.Types.ObjectId,
ref: 'Ingredient'
},
unit: {
type: Schema.Types.ObjectId,
ref: 'Unit'
},
created: {
type: Date,
default: Date.now
}
});
var RecipeIngredient = mongoose.model('RecipeIngredient', RecipeIngredientSchema);
Ma question vient dans deux parties:
- Je suis aller sur ce d'une manière sensible en termes de modélisation de données ou suis-je loin?
- Quel serait le processus d'enregistrement d'une recette avec de multiples ingrédients ressemblent réellement?
Je suis en cours de réflexion suivants:
exports.create = function(req, res) {
var recipe = new Recipe(req.body);
recipe.save(function(err, recipe) {
if (err) {
return res.jsonp(err);
} else {
//Loop ingredients
if (req.body.ingredients) {
for(var prop in req.body.ingredients) {
var recipeIngredient = new RecipeIngredient({
recipeId: recipe._id,
ingredientId: mongoose.Types.ObjectId(req.body.ingredients[prop])
});
recipeIngredient.save(function(err, recipeIngredient) {
if (err) {
return res.jsonp(err);
} else {
recipe.recipeIngredients.push(recipeIngredient._id);
recipe.save(function(err, recipe) {
return res.jsonp(recipe);
});
}
});
};
}
}
});
}
J'ai l'impression que c'est compliqué et généralement malce serait apprécier quelques conseils!
source d'informationauteur James
Vous devez vous connecter pour publier un commentaire.
La beauté de bases de données NoSQL (ou document de magasins en général), c'est que vous n'avez pas à fractionner vos données dans plusieurs tables/collections. Vous pouvez stocker toutes les données connexes en une seule entité afin que vos opérations de lecture arriver d'un seul coup.
Il n'y a pas de "bonne" méthode pour le faire, mais si vous allez utiliser NoSQL, je voudrais envisager de sauver l'intégralité de la recette (recette et ingrédients et directions) comme un document unique plutôt que le fractionnement des données en 3 ou 4 tables à la modèle relationnel.
Par exemple, je voudrais enregistrer une seule recette comme suit:
Maintenant, ce n'est pas de poussière de lutin. Il y aura des moments où le fait d'avoir les données réparties dans plusieurs tables/collections et d'avoir un relationnel langage de requête (comme SQL) sera bénéfique pour les données de la requête. Par exemple, si vous voulais l'interroger tous les des recettes qui utilisent des 'tomates' avoir une base de données relationnelle avec une table de jointure pour la recette et les ingrédients relations qui pourrait la rendre beaucoup plus simple que l'approche NoSQL.
C'est une décision que vous aurez besoin de prendre à un point: Êtes-vous mieux avec un NoSQL ou avec un RBMS pour votre application?
Si vous souhaitez enregistrer les objets imbriqués dans la bd, vous avez deux options: intégré, schéma ou avec réf. Si vous enregistrez avec ref eux imbriquée schéma est enregistré dans une collection à part.
De commencer à prendre un coup d'oeil à cet exemple mongo-plusieurs-à-plusieurs et celui-ci section: économie-refs