私は、モバイルカーディテーリング会社 (およびできれば他の会社) の管理に役立つ管理アプリケーションを構築しています。一部のデータをモデル化する方法を理解するのに苦労しています。
この質問は、私が投稿した以前の質問に関連していますが、以下の関連情報を再現しました: データベース設計 - Google アプリ エンジン
このアプリケーションには、「予定」と「明細」という概念があります。
予定は、従業員がサービスを提供するために予定されている場所と時間です。
項目は、サービス、料金、または割引とそれに関連する情報です。予定に入る可能性のある項目の例:
名前: 価格: 手数料: 所要時間 フル ディテール、レギュラー サイズ: 160 75 3.5 時間 $10 オフの詳細クーポン: -10 0 0 時間 プレミアム詳細: 220 110 4.5 時間 派生合計 (明細項目ではない): $370 $185 8.0 時間
このアプリケーションの以前の実装では、明細項目は 1 つの予定に含まれていました。これはほとんどの場合問題なく動作しましたが、時々問題が発生しました。たとえば、雨のために予定が途中で中断され、技術者が翌日戻ってきて仕上げなければならなかった場合などです。この状況では、同じ品目に対して 2 つの予約が必要でした。このような場合、2 番目の予定に「明細項目」を設定して「終了」などと読み上げることで、データを少しごまかすだけで、費用は 0 ドルになります。
この次のバージョンでは、次のようなテーブル構造を使用して、明細項目を複数の予定と照合できるようにすることを検討しています。
Appointment
start_time
etc...
Line_Item
appointment_Key_List
name
price
etc...
この構造の一般的な問題は、構造が複雑で、1 つの項目を複数の予定と一致させることが適切かどうかさえわからないことです。Line Items が 1 つの Appointment の一部にしかならない場合、実際には各 Appointment に Line Items のリストを入れるだけで済みます。
より具体的な問題は、Google App Engine を使用していて、一連の予定とそれに関連する項目をクエリする場合、最初に一連の予定をクエリしてから、その回線に対して 2 番目のクエリを実行する必要があることです。 IN 演算子を使用して、Line_Item の予定キーのいずれかが、前のクエリから返された一連の予定キーに該当するかどうかをテストします。クエリを分割する必要があるキーが 30 個を超える場合、2 番目のクエリは失敗します。この複雑で大規模な読み取りクエリを回避するためにデータを非正規化することもできますが、おそらくある程度非正規化する必要がありますが、必要に応じて複雑さを避けたいと思います。
私の質問は、この種の状況は通常どのようにモデル化されているのですか? ラインアイテムを複数の予定とペアにすることは適切ですか、それとも、「2 日間の仕事の前半」と「2 日間の仕事の後半」のように、ラインアイテムを単に予定ごとに別々のものに分割するのが普通ですか? ." 同様の成功したアプリケーションはどのようにこれを行いますか? この種の状況における経験則は何ですか? 問題が少ないことが判明した実装はどれですか?
ありがとう!