更新引用数据更新的嵌入数据

时间:2017-01-18 13:16:08

标签: mongodb meteor

我正在构建一个Meteor应用程序,目前正在创建这些出版物,并且针对相关vs嵌入式文档的常见设计困境。我的数据模型(简化)有Bookings,每个都有相关的Client和相关的Service。为了优化检索集合的速度,我在Client中嵌入ServiceBooking的关键字段,并且还链接到ID - 我的预订模型具有以下内容结构:

export interface Booking extends CollectionObject {
  client_name: string;
  service_name: string;
  client_id: string;
  service_id: string;
  bookingDate: Date;
  duration: number;
  price: number;
}

在此模型中,client_idservice_id是对链接文档的引用,client_name / service_name在显示预订列表时会被嵌入。< / p>

这对我来说似乎都很好但是这个难题的缺失部分是保持这个嵌入数据是最新的。如果系统的单独部分中的用户更新服务(这将是一个反应性集合),那么我需要这个来触发service_name更新到具有相应服务ID的任何预订。有没有我应该订阅的活动,或者我可以吗?客户端,我有一个表单允许用户添加/编辑一个只使用MongoObservable集合上的插入或更新方法的服务 - 我的OOP部分感觉需要在服务器代码中重写,然后再更新相关数据还是我完全以错误的方式解决这个问题?

这一切都无关紧要,我实际上只是使用https://atmospherejs.com/reywood/publish-composite并返回相关文档的集合(感觉就像在一次返回数百个预订时会损害生产环境中的性能)

1 个答案:

答案 0 :(得分:1)

我在您描述时使用了很多“外键”概念,并且当您使用服务名称时,会对集合中的数据进行反规范化。我明确地这样做是为了避免额外的查找/发布。

我使用2种策略来保持最新状态。第一个是在保存源数据时完成的,例如在Meteor方法调用中。我将在现场更新非规范化数据,触摸其他集合。我会在“高读,低写”场景中完成所有这些。

另一个策略是在更新源集合时使用集合挂钩来触发。我使用这个包:matb33:collection-hooks

从概念上讲,它与第一个类似,但知道何时这样做的钩子是不同的。

我们正在使用的当前应用中使用的示例:我们有一条带有评论的新闻Feed。新闻项和评论在单独的集合中,每个记录的评论集合都具有相关新闻项的ID。

我们保留与新闻项本身相关的正在运行的评论计数。无论何时添加或删除注释,我们都会递增/递减计数并立即更新新闻项目。