2017-01-18 13 views
3

私はMeteorアプリケーションを構築していますが、現在出版物を作成しています。私のデータモデル(簡略化)はBookingsであり、それぞれが関連するClientと関連するServiceを持っています。このモデルでは参照データ更新の埋め込みデータを更新する

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

: - 私はBookingClientServiceのキーフィールドを埋め込むこと、また、IDにリンクしていますコレクションを取得する速度を最適化するために、私の予約・モデルは、以下の構造を有しますclient_idおよびservice_idは、リンクされたドキュメントへの参照であり、client_name/service_nameは、予約のリストを表示する際に使用されるように埋め込まれています。

このすべては私にとってうまく見えますが、パズルの欠落部分はこの埋め込みデータを最新の状態に保っています。システムの別の部分にあるユーザーがサービス(リアクティブ・コレクションとなる)を更新する場合は、対応するサービスIDの予約にservice_nameの更新をトリガーする必要があります。私がこれを購読するべきイベントはありますか、それともできますか?クライアント側では、MongoObservableコレクションのinsertメソッドやupdateメソッドを使用するサービスを追加/編集できるフォームがあります。私のOOP部分は、サーバーコードでオーバーライドして更新する必要があるように感じます関連するデータ、または私は完全に間違った方法についてこれを行っていますか?

は私が多くを使用して、このすべての無関係なと私は実際にちょうどhttps://atmospherejs.com/reywood/publish-compositeを使用し、関連文書のコレクションを返しshoudl(一度に数百の予約を返すとき、それは、本番環境でのパフォーマンスを害するようにそれだけで感じている)

答えて

1

ですあなたが記述しているような "外部キー"の概念を理解し、サービス名でやっている間にコレクション全体のデータを非正規化します。私は余分なルックアップ/パブリッシュを避けるためにこれを明示的に行います。

私は最新のものを維持するために2つの戦略を使用します。 Meteorメソッド呼び出しのように、ソースデータが保存されると、最初の処理が実行されます。正規化されていないデータをその場で更新し、他のコレクションに触れさせます。私はこれを "ハイリード、ローライト"のシナリオでやります。

もう1つの方法は、ソースコレクションが更新されたときにコレクションフックを使用して起動する方法です。私はこのパッケージを使用しています:matb33:collection-hooks

概念的には、それは最初のものと似ていますが、いつ行うべきかを知るためのフックは異なります。

私たちが現在取り組んでいるアプリケーションで使用している例:コメント付きのニュースフィードがあります。ニュースアイテムとコメントは別々のコレクションにあり、コメントコレクションには関連するニュースアイテムのIDがそれぞれのレコードに含まれています。

ニュース項目自体に関連付けられた実行中のコメント数を保持します。コメントが追加または削除されるたびに、カウントを増減してすぐにニュース項目を更新します。

関連する問題