我的模型应该有多细粒度

How fine grained should my model be?

本文关键字:细粒度 模型 我的      更新时间:2023-09-26

使用meteor的数据模型应该有多细粒度?

假设我有一个包含多个XmlNodesXmlDocument模型。

我是否应该简单地创建一个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实体框架)?

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

不要每次都重新创建整个文档,而是使用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);

在数组中更新对象是拥有大型嵌套对象的一个缺点。将它们分开的缺点是你必须确保将它们一起发布。很明显,你失去了操作的原子性。如果您希望同时对节点和文档进行更新。这是你的决定,而不是流星的"实现"

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

不幸的是,在任何文档更改时,它将发送整个文档,直到客户端。所以我认为,这是不明智的,以这种方式构建数据库结构-意味着一个大文档在一个集合(而不是几个集合)。如果您安装并启用流星DDP分析器,您可以看到DDP如何工作以及它将发送什么。