我的模型应该有多细粒度
How fine grained should my model be?
使用meteor的数据模型应该有多细粒度?
。
假设我有一个包含多个XmlNodes
的XmlDocument
模型。
我是否应该简单地创建一个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如何工作以及它将发送什么。
相关文章:
- 在VanillaJS中模拟模型双向数据绑定
- 为集合分配大量的模型弹药
- 如何使用backbone.js从集合中获取模型名称
- 骨干模型默认值-todos.js示例中不必要的代码
- EmberJS中支持单字母单词模型
- 2个backbone.js集合,具有相同的模型,但排序顺序不同
- 将不在模型中的数据返回到mvc控制器
- 如何在视图模型contet更新更新上调用Jquery函数
- 如何使用Javascript客户端对象模型检索Sharepoint 2010列表项权限
- 我应该如何检查主干.主干.模型更改时查看
- Ext.js从json构建模型关系的问题
- 显示模块模式在Knockout中设置模型的新实例
- 使用导航属性创建Kendo UI网格模型的问题
- Angular,函数在(模型)工厂中返回值
- 如何将本地json数据加载到Extjs数据模型中
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- 更新成员数据模型中的记录列表
- D3 轴标签在放大时变得过于细粒度
- 我的模型应该有多细粒度
- 更细粒度的闭包编译器标志