我是MongoDB和NoSQL数据库的新手,我正在尝试为字体库web-app设计数据库架构。
Font.js
var FontSchema = mongoose.Schema({
families: [{ type: Schema.Types.ObjectId, ref: 'Family' }], // Font families (ex: Sans-serif)
name: String, // Font name (ex: Helvetica)
style: String, // Font style (ex: Bold Italic)
tags: [String], // Array of tags
file: {
name: String, // File name
location: String, // File location
}
});
Family.js
var FamilySchema = mongoose.Schema({
parent: { type: Schema.Types.ObjectId, ref: 'MainFamily' },
name: String
});
MainFamily.js
var MainFamilySchema = mongoose.Schema({
name: String
});
我想我在这里思考SQL,也许 Family 和 MainFamily 模型太多了。我可以将它们嵌入到 Font 文档中,但我有一些问题:
我发布的架构是否适合这项工作?
如果我想重命名 系列或 MainFamily ,如果名称在每个字体中以字符串形式存在,会发生什么情况文件?
如何检索所有系列或主系列名称而不检索所有字体,然后将其过滤掉?
答案 0 :(得分:0)
这似乎是一个RDBMS案例 - 就目前而言。但是你可以将它简化为一个集合(等于表格)
是的,这就是“正常化”的方式。它通过在每个字体文档中包含族名来为NoSQL。您可以重命名所有相关的'使用update,$ set和multi等文档
db.font.update({family: "Sans-Serif"}, {$set: {family: "Sans-serif"}}, {multi: true})
这比RDBMS更不友好(并且一旦你的字体表变大,代价很高),但可以使用聚合来实现它。您还可以添加一些有用的数据,例如每个家庭下的字体数。
db.font.aggregate({$match: {_id: "$familyName", total: {$sum: "$fontId" } )
你的目标正在接近
{"_id": "Sans-serif", "total": 120},
{"_id": "Serif": "total": 130},,,
以上几乎肯定是不正确的,因为它已脱离袖口,但请查看docs示例。它很容易,值得一试。
作为3的第二选择。在NoSQL世界中没有任何错误(仅在此用例中使用表),认识到第二个便利表可能与当前字体表不一致,即使是片刻。又如果您刚刚添加了一个新系列的新字体...所以您必须定期重建它,具体取决于使用模式。然后使用由crontab生成的mongo shell脚本。