2017-09-20 3 views
1

私は、作業しているリレーショナルデータベースの正しいデザインを見つけようと壁を打ちました。0または1から0または1の関係をモデル化する?それは事ですか?

定義:

  • クライアント:サービスを取得するために、ショップに入ってくる人。
  • ユーザー:クライアントが要求するサービスを実行するユーザー。
  • 予約:特定の時点で店舗の場所にいるというクライアントとユーザーの間の合意。
  • ショップ: サービスを提供しているユーザーのセット。
  • サービス:私はサポートしようとしている技術的なプロセス

ユースケース:

  • クライアントがショップを呼び出し、 ユーザーからサービスを取得する予定を設定します。
  • クライアントがショップの場所に移動し、 ユーザーからのサービスが必要です。

問題: Aサービスは、クライアントとユーザーとの関係を持っていますが、これもサービスに関連している(1が実際に存在する場合)の予定はありません。

アポイントメントが作成された場合、アポイントメントは実際には通っていない可能性があるため、空のサービスを作成することはできません。サービスには、予定。また、サービスは、ユーザー、クライアント、および予定がある場合にのみサービスではなく、有効なサービスであるためには他の属性が必要です。

私はAppoitmentとServiceの両方でUserとClientを繰り返すことが正しいとは思えません。これは、将来的に何らかの整合性の問題があるかもしれないからです。

この問題にはどのようなアプローチが適していますか?

+0

サービスとアポイントメントの関係は何ですか?サービスは、1つ、複数の、および/またはゼロのサービスのためにできますか?予約なしでサービスを受けることはできますか? (ウォークインの場合、「ダミー」の予約をしない理由は何ですか?)適格なユーザーがいないためにサービスが実行される可能性のあるウォークインを追跡する必要がありますか? –

+0

サービスにはアポイントメントがある場合とない場合があります。はい、予約なしでサービスを受けることができます。その理由は、私はダミーのアポイントメントをしなくてはならないということです。1.ウォークインのために実際のアポイントメントは起こっていません。2.レポート/メトリクスex。キャンセルされたアポイントメントの割合、3.アポイントメント時間ビジネスルール。しかし、私はまだ、これらの理由がダミーの予定を考慮しないのに十分であると完全には確信していません。完成していないウォークインを追跡することは考えていないが、ある時点で必要になると思う。私の計画は、すべての有資格ユーザーがビジー状態の場合、将来の予定を作成することだった。 – Mandi

答えて

1

私は次のように始まり、新しいビジネスルールが登場したときに適応します。

まず、クライアントの「ベース」のテーブル、Shopes、ユーザー、およびサービス(行うことができる作業)

CLIENT 
ClientId 
Name 
ContactInformation 

SHOP 
ShopId 
Name 
OtherAttribues 

USER 
UserId 
ShopId 
Name 
Etc 

(Note: Assumes a user works in only one shop, otherwise you need a many-to-many 
    table joining SHOP and USER. See further reminders below.) 

SERVICE 
ServiceId 
Name 
FurtherAttributes 

(This is the “master list” of all available services that can be done. “ServiceEvent” 
    is used to record actual work being done.) 

次に、複雑な表:

SERVICEEVENT 
ServiceEventId 
ClientId (who the work was done for) 
UserId (who did the work work. Add ShopId if a User can work in multiple shops) 
ServiceId (what work was done) 
FurtherAttributes (time, cost, etc.) 

(This is used to record actual work that was done--or perhaps, is being done?) 

APPOINTMENT 
AppointmentId 
ClientId (who the work will be done for) 
UserId  (who will be doing the work. Add ShopId if a User can work in multiple shops.) 
ServiceId (What work will be done) 
ServiceEventId NULLABLE (the ServiceEvent, if any, produced by this Appointment) 
Status  (indicate pending, cancelled, completed, etc.) 
FurtherAppointmentAttributes (when the appointment was made, etc.) 
FurtherServiceEventAttributes (optional? data used to populate ServiceEvent, when it comes time to do so) 

(Should consider creating a lookup table for "Status".) 

「アポイントメント"と" ServiceEvent "は本当に2つの異なるものです。それらは似ていますが、それぞれが他のもの(キャンセルされた予定、ウォークインサービスイベント)なしで存在することができるので、両方ともすべてのキーが必要です。アポイントメントを介して生成されたServiceEventは、アポイントメントからデータを読み込み、それをServiceEventに挿入するルーチンによって作成されます。

これらの間のリンク(外部キー)はいずれのテーブルにもあり得ます。理想的にはすべての予定がServiceEventを生成するので、私はAppointmentに入れますが、その逆は真実ではありません。

+0

ありがとう、これは私がやろうと思っていたものですが、両方のテーブルにクライアントとユーザーの関係があるのは変です。ステータステーブルの提案をありがとうございます。私たちは、予定ステータスとサービスステータスの両方について既知の値を設定しており、現在はテーブルの属性として処理しています。このモデルを実装することによってもたらされるスケーラビリティの問題はありますか?アポインメントに外来キーを設定するのはなぜより良いのでしょうか?パフォーマンスが向上するのはなぜですか?もう一度、ありがとう! – Mandi

+0

Appointmentに外来キーを置くのは、ServiceEventが大きなテーブルである可能性が高いためです。アポイントメントの(うまく広大な)大部分は一致するServiceEventsを持ち、(多くの)ウォークインServiceEventsがあります。そのテーブルを小さくすると、パフォーマンスが向上します。 4バイトの列を1つ使用すると、そのパフォーマンスの差異が人間によって顕著になることはたくさんありますが、まだまだです。 –

+0

スケーリングについては、あなたが問題のセットについて教えてくれたことを考えれば、テーブルは私にとって確固たるようです。あなたの次の焦点となるインデックスは、テーブルに対して実行するクエリに完全に依存します。少なくとも、パフォーマンスが上がることがわかっているクエリです。 –

関連する問題