字体库的正确 MongoDB 架构?
The right MongoDB architecture for a font library?
我是 MongoDB 和 NoSQL 数据库的新手,我正在尝试为字体库 Web 应用程序设计数据库架构。
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
});
主要Family.js
var MainFamilySchema = mongoose.Schema({
name: String
});
我想我在想 SQL 这里,也许 Family 和 MainFamily 模型太多了。我可以将它们嵌入到 Font 文档中,但我有一些问题:
我发布的架构适合这份工作吗?
如果我想重命名一个Family或MainFamily[=48=会怎样] 如果名称作为字符串存在于每个 Font 文档中?
如何在不检索所有字体的情况下检索所有族或主要族名,然后将其过滤掉?
这似乎是一个 RDBMS 案例——就目前而言。但是你可以把它简化成一个集合(等于一个table)
是的,这就是 'de-normalize' NoSQL 的方法,方法是在每个字体文档中包含姓氏。您可以使用 update、$set 和 multi 重命名所有 'related' 文档,例如
db.font.update({family: "Sans-Serif"}, {$set: {family: "Sans-serif"}}, {multi: true})
这比 RDBMS 更不友好(一旦你的字体 table 变大,成本也会更高),但可以使用聚合来实现它。并且你还可以添加一些有用的数据,比如每个家族下的字体数量。
db.font.aggregate({$match: {_id: "$familyName", total: {$sum: "$fontId" } )
您的目标是
{"_id": "Sans-serif", "total": 120},
{"_id": "Serif": "total": 130},,,
以上几乎肯定是不正确的,因为它是即兴的,但请检查 docs 以获取示例。它很简单,值得一试。
作为 3 的第二个选择。(在 NoSQL 世界中)仅针对此用例使用 table 并没有错,认识到第二个便利 table 可能与当前字体 table 甚至片刻。也就是如果你刚刚添加了一个新字体系列......所以你必须定期重建它,具体取决于使用模式。然后使用由 crontab 生成的 mongo shell 脚本。
我是 MongoDB 和 NoSQL 数据库的新手,我正在尝试为字体库 Web 应用程序设计数据库架构。
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
});
主要Family.js
var MainFamilySchema = mongoose.Schema({
name: String
});
我想我在想 SQL 这里,也许 Family 和 MainFamily 模型太多了。我可以将它们嵌入到 Font 文档中,但我有一些问题:
我发布的架构适合这份工作吗?
如果我想重命名一个Family或MainFamily[=48=会怎样] 如果名称作为字符串存在于每个 Font 文档中?
如何在不检索所有字体的情况下检索所有族或主要族名,然后将其过滤掉?
这似乎是一个 RDBMS 案例——就目前而言。但是你可以把它简化成一个集合(等于一个table)
是的,这就是 'de-normalize' NoSQL 的方法,方法是在每个字体文档中包含姓氏。您可以使用 update、$set 和 multi 重命名所有 'related' 文档,例如
db.font.update({family: "Sans-Serif"}, {$set: {family: "Sans-serif"}}, {multi: true})
这比 RDBMS 更不友好(一旦你的字体 table 变大,成本也会更高),但可以使用聚合来实现它。并且你还可以添加一些有用的数据,比如每个家族下的字体数量。
db.font.aggregate({$match: {_id: "$familyName", total: {$sum: "$fontId" } )
您的目标是
{"_id": "Sans-serif", "total": 120},
{"_id": "Serif": "total": 130},,,
以上几乎肯定是不正确的,因为它是即兴的,但请检查 docs 以获取示例。它很简单,值得一试。
作为 3 的第二个选择。(在 NoSQL 世界中)仅针对此用例使用 table 并没有错,认识到第二个便利 table 可能与当前字体 table 甚至片刻。也就是如果你刚刚添加了一个新字体系列......所以你必须定期重建它,具体取决于使用模式。然后使用由 crontab 生成的 mongo shell 脚本。