字体库的正确 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 这里,也许 FamilyMainFamily 模型太多了。我可以将它们嵌入到 Font 文档中,但我有一些问题:

  1. 这似乎是一个 RDBMS 案例——就目前而言。但是你可以把它简化成一个集合(等于一个table)

  2. 是的,这就是 'de-normalize' NoSQL 的方法,方法是在每个字体文档中包含姓氏。您可以使用 update、$set 和 multi 重命名所有 'related' 文档,例如

    db.font.update({family: "Sans-Serif"}, {$set: {family: "Sans-serif"}}, {multi: true})
    
  3. 这比 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 脚本。