すべてのリレーショナルデータベースでは、多対多リレーションシップには、その組み合わせを表すための結合テーブルが必要です。答えに示されているように(しかし、理論的な背景はあまりありません)、すべての組み合わせを格納するテーブルを中央に置かずに多対多の関係を表現することはできません。
また、ヒストリを必要としない場合にのみ問題を解決するということも解決策に記載されています。現実の世界のアプリケーションでは、ほとんどの場合、履歴データを表現する必要があることを伝えてください。これを行うには多くの方法がありますが、単純な方法は、追加テーブルを使用して三項関係と呼ばれるものを作成することです。理論的には、他の2つのソーステーブルの継承されたキーとプライマリキー(別個のタイムスタンプなど)をリンクする「時間」テーブルを作成することもできます。これにより、同じ時間内に2つの車が同じ駐車場にある場合のエラーを防ぐことができます。タイムテーブルを使用すると、単純な整数IDを使用して複数の駐車場に同じ時間データを再利用することができます。
テーブル車 car_id(整数/数字はインデックスに最速です) ...
テーブルの駐車スペース が 場所
をspace_idので
だから、あなたのデータテーブルは、次のようになりますテーブルタイムスロット time_id整数 begin_datetime(必要がなければ秒を使用しないでください!) end_time(あなたがしなければ秒を使用しないでください!)
ここで、それは楽しいものです。あなたは、car.car_id + parking_space.space_id + time_idで構成された複合主キーを持つ中間テーブルを追加します。あなたがここで最適化するために追加することができる他のものがありますが、あなたは考えを得る、私は願っています。
テーブル予約 car_id PK parking_space_idのPK TIME_IDのPK(それは整数だ - ちょうどできるだけきめ細かいとしてそれを維持しよう - 30分単位か何か - あなたは、これは秒/ミリ秒を含めることができた場合は/ etc利点あなたがタイムテーブルから同じ値を再利用することができないためキャンセルされます) (これは、この特定のアカウント、予約などとは異なる変動金利、割引などを保存する場所でもあります)。
今では、ジョインテーブル(予約)でタイムスタンプを複製していないため、データ量を減らすことができます。整数を使用することで、複数の駐車スペースにそのタイムスロットを再利用できますが、指定された日/時間枠で同じ「タイムスロット」のスポットを2台の車がレンタルできないように制約を適用することもできます。これはまた、顧客に関するいくつかの履歴を保存することを容易にするでしょう。誰が知っていますか、より頻繁に賃貸して割引を提供する顧客に関するレポートを見たいかもしれません。
3つの関係モデルを使用することで、特定のタイムスロット(各バリデーションルールが追加されている可能性があります)ごとに各スポットが一意になります。
タイムスタンプの代わりに整数をキーとして使用することで、データベースをインデックス化してソート/照会する必要がなくなります。大量のデータセットがあり、効率が必要な場合のデータウェアハウス/ OLAPレポート作成では、これが一般的な方法です。私はそれがここにも当てはまると思う。
これは理にかなっています。それぞれの外部キーの一意性制約は、後の制約を強制します。 – CyberMonk