使用MongoMapper中的可选键或全能键?

时间:2012-03-30 01:16:02

标签: mongodb schema database-schema mongomapper

假设我正在使用如下所示的MongoMapper类:

class Animal
    include MongoMapper::Document

    key :type, String, :required => true
    key :color, String
    key :feet, Integer
end

现在我要存放一只鸟的翼展。添加它会更好吗,即使它与许多文档无关,并且感觉有些不整洁:

    key :wingspan, Float

或者说,即使这是一个让人感觉像是黑客攻击的无所不在:

    key :metadata, Hash

似乎:元数据方法(我继承的代码中有先例)对整个Mongo文档来说几乎是多余的:它们都是无关键值对的无模式桶。 / p>

然而,似乎添加动物专用键对于一个非常难看的模型来说是一个滑坡。

任何替代方案(创建Bird子类)?

2 个答案:

答案 0 :(得分:1)

MongoMapper不存储nil的密钥,因此如果您确实定义了key :wingspan,那么实际设置该密钥的文档将存储它。

如果您选择不定义密钥,您仍然可以使用my_bird[:wingspan] = 23设置/获取密钥。 ([]调用实际上会自动为您定义一个键;类似地,如果一个文档从MongoDB返回并且没有明确定义的键,将为它和该类的所有文档定义一个键 - 它就是为整个类定义它的错误,但由于nil密钥没有存储,所以它不是一个问题。)

如果鸟也有自己的行为(可能确实如此),那么子类就有意义了。对于鸟类和动物,我会采取这种方式,因为每只鸟都是动物。对于Single Table / Single Collection继承,MongoDB比ActiveRecord好得多,因为您不需要十亿次迁移您的代码可以清楚地了解哪些属性与哪些类相关。 / p>

答案 1 :(得分:1)

如果不知道将来如何扩展数据库以及如何使用您存储的信息,很难给出一个好的答案。如果你要存放大量的鸟类并且希望总结一下翼展,那么即使它不会用于其他动物,翼展也会有所帮助。如果您计划为每个已知动物存储随机任意信息,那么尝试在模式中跟踪的可能性太多,元数据方法将更有用。