适合字体库的MongoDB架构?

时间:2015-04-13 15:43:00

标签: mongodb database-design architecture database nosql

我是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 ,如果名称在每个字体中以字符串形式存在,会发生什么情况文件?

  • 如何检索所有系列或主系列名称而不检索所有字体,然后将其过滤掉?

1 个答案:

答案 0 :(得分:0)

  1. 这似乎是一个RDBMS案例 - 就目前而言。但是你可以将它简化为一个集合(等于表格)

  2. 是的,这就是“正常化”的方式。它通过在每个字体文档中包含族名来为NoSQL。您可以重命名所有相关的'使用update,$ set和multi等文档

    db.font.update({family: "Sans-Serif"}, {$set: {family: "Sans-serif"}}, {multi: true})
    
  3. 这比RDBMS更不友好(并且一旦你的字体表变大,代价很高),但可以使用聚合来实现它。您还可以添加一些有用的数据,例如每个家庭下的字体数。

    db.font.aggregate({$match: {_id: "$familyName", total: {$sum: "$fontId" } )
    
  4. 你的目标正在接近

        {"_id": "Sans-serif", "total": 120},
        {"_id": "Serif": "total": 130},,,
    

    以上几乎肯定是不正确的,因为它已脱离袖口,但请查看docs示例。它很容易,值得一试。

    作为3的第二选择。在NoSQL世界中没有任何错误(仅在此用例中使用表),认识到第二个便利表可能与当前字体表不一致,即使是片刻。又如果您刚刚添加了一个新系列的新字体...所以您必须定期重建它,具体取决于使用模式。然后使用由crontab生成的mongo shell脚本。