【问题标题】:How fine grained should my model be?我的模型应该有多细?
【发布时间】:2014-08-17 03:22:57
【问题描述】:

使用流星的数据模型应该有多细?

例如

假设我有一个 XmlDocument 模型,其中包含多个 XmlNodes

我是否应该简单地创建一个 new Meteor.Collection("Documents") 并在整个文档的基础上进行更新,例如

Documents = new Meteor.Collection("documents");

Documents.insert(new XmlDocument());

var doc = Documents.findOne().fetch();

doc.nodes.push(new XmlNode());

Documents.update(doc);

或者我应该将节点拆分为一个单独的集合,其中每个项目都有一个其所属文档的 id(即与 .NET Entity Framework 一样)?

我很难弄清楚这一点,因为我不确定 Meteor 实现的粒度有多细,即在执行 update 时,它是否与当前版本执行差异,并且只执行最少量的对服务器工作,还是将整个数据作为单个事务发送?

【问题讨论】:

    标签: javascript mongodb meteor


    【解决方案1】:

    不要每次都重新创建整个文档,而是使用 addToSet 并拉入文档中的数组。

    var _newDocId = Documents.insert(new XmlDocument());
    var _newNode = new XmlNode();
    Documents.update({_id: _newDocId}, {$addToSet: {nodes: _newNode}});
    

    更新数组中的文档有点棘手,因此您可能需要确保这是您想要做的,而不是使用单独的集合,但是,您可以执行类似的操作

    var _document = Documents.findOne({_id: _documentContainingNode});    
    var _nodeToUpdateIndex = _.indexOf(_.pluck(_document.nodes, '_id'), _nodeId);
    var _modifier = {$set: {}};
    _modifier.$set["nodes." + _nodeToUpdateIndex + ".description"] = "new description";
    
    Documents.update({_id: _document._id}, _modifier);
    

    更新数组中的对象是大型嵌套对象的缺点。 将它们分开的缺点是您必须确保将它们一起发布。而且,显然,您失去了操作的原子性。如果您想同时更新节点和文档。 与 Meteor “实施”相比,这更多是您的决定

    【讨论】:

      【解决方案2】:

      还是将整个数据作为单个事务发送?

      很遗憾,是的,在任何文档更改时,它都会将整个文档发送给客户。所以我认为,以这种方式构建数据库结构是不明智的 - 意味着一个集合中的一个大文档(而不是几个集合)。如果您安装并启用Meteor DDP Analyzer,DDP 的工作原理以及它将向您发送什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 2019-04-04
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        相关资源
        最近更新 更多