我正在构建一个Meteor应用程序,当前正在创建出版物,并且遇到了围绕相关文档和嵌入式文档的常见设计难题。我的数据模型(已简化)具有Bookings
,每个模型都有一个relatedClient
和一个related Service
。为了优化检索收集我嵌入的重点领域的速度Client
和Service
在Booking
,并链接到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_id
和service_id
是对链接文档的引用和client_name
/ service_name
,因为它们在显示预订列表时被使用。
在我看来,这一切都很好,但是难题的缺失部分是使此嵌入式数据保持最新。如果系统另一部分中的用户更新了一项服务(这将是一个响应式集合),那么我需要它来触发将service_name更新为具有相应服务ID的所有预订。有什么活动可以订阅吗?客户端,我有一个表格,允许用户添加/编辑仅使用MongoObservable集合上的insert或update方法的Service-我的OOP部分感觉需要在服务器代码中覆盖此内容,然后再进行更新相关数据还是我完全以错误的方式进行此操作?
这一切都是无关紧要的吗,我实际上只是使用https://atmospherejs.com/reywood/publish-composite并返回相关文档的集合(感觉是一次返回数百个预订会损害生产环境中的性能)
正如您所描述的那样,我使用了很多“外键”概念,并且在处理服务名称时会对集合中的数据进行非规范化。我明确地这样做是为了避免额外的查找/发布。
我使用2种策略来保持最新状态。第一种是在保存源数据时完成的,例如在Meteor方法调用中。我将立即更新反标准化数据,并触摸其他集合。我会在“高读取,低写入”情况下进行所有这些操作。
另一种策略是在更新源集合时使用集合挂钩触发。我用这个包:matb33:collection-hooks
从概念上讲,它类似于第一个,但是了解何时执行此操作的钩子有所不同。
我正在使用的当前应用程序中使用的示例:我们有一个带有评论的新闻提要。新闻项和评论位于单独的集合中,并且评论记录的每个记录均具有关联新闻项的ID。
我们会保持与新闻条目本身相关的连续评论计数。每当添加或删除评论时,我们都会增加/减少计数并立即更新新闻项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句