4

RDBS でのタイム テーブル モデリングに関連するほとんどすべてのことについて説明されていることは知っていますが、タイム テーブルを DB に格納するための利用可能な手法について適切に書かれたドキュメントを見つけることができません。

私の場合:

  • 利用可能な場所を保持するテーブルと、実際のクラスを含むテーブルがあります。
  • 各場所には独自のスケジュールがあります
  • 各クラスは、いくつかの例外を除いて、いつでもどこでもスケジュールできます。
    • 1 つのクラスは 1 つの時間枠を取ることができます (例: クラス A が 12:00 に P1 の場所で 1 時間スケジュールされている場合、クラス A の次の発生は、12:00 の前または 13:00 の後にのみ、任意の場所で配置できます。時間枠に空きがあります。Aクラスを2ヶ所で一度にスケジュールすることは禁止されています)
    • 1つの場所で、時間枠のある1つのクラスにすることができます
  • モデルは、スケジュールされたクラスのバージョン管理/履歴をサポートする必要があります

では、このデータ モデルを SQL DB で表現するにはどうすればよいでしょうか。

すぐに使用できる正確なスキーマを探しているわけではありません。むしろ、このタスクを解決するために使用できる、利用可能なモデリング手法とその比較を誰かが書いてくれるとうれしいです。

例: ツリー構造/階層データの場合、「変更されたプレオーダー ツリー トラバーサル アルゴリズム」が十分に文書化されていますが、タイムスロットを処理するための同様のアルゴリズム/手法はありますか?

4

2 に答える 2

1

timetable はマトリックスです。左側に LOCATIONS があります。上部に TIMESLOTS があります。LOCATION と TIMESLOT の特定の順列の交点は、CLASS または null のいずれかを持つセルです。

これをモデル化するには、かなり固定されたデータである LOCATIONS のテーブル (エンティティ) が必要です。増え続ける TIMESLOTS (日付/時刻) のテーブルが必要です。テーブル CLASSES が必要ですが、これもかなり固定されています。最後に、交差テーブル CLASS_TIMESLOT_LOCATIONS が必要です。ここで魔法が起こります。このテーブルには 3 つの外部キーがあり、1 つは CLASSES、1 つは LOCATIONS、もう 1 つは TIMESLOTS です。その主キーは (LOCATION_ID, TIMESLOT_ID) ですが、(CLASS_ID, TIMESLOT_ID) に対する一意の制約も必要です。


モデリングの質問をしていますが、考慮する必要がある実装の詳細がいくつかあります。論理モデルは変更されませんが、物理テーブルの操作方法に影響します。最初の考慮事項は、すべての潜在的な TIMESLOTS を生成するかどうか、および生成する場合は、格納するウィンドウの大きさです。2 つ目は、交差テーブル CLASS_TIMESLOT_LOCATIONS に null エントリを格納するかどうかです。

ここには簡単な答えはありません。一部のデータベース製品は、他の製品よりも「ギャップを埋める」方が簡単です。また、存在しないレコードをオンザフライで生成すると、パフォーマンスへの影響が大きすぎる可能性があります。その場合、ディスク容量は適切なトレードオフです。


履歴の保存に関しては、これはおそらくスケジュールの変更を保存するためのものです。これには、トリガーによって設定された別のテーブルを使用します (ストアド プロシージャを使用できますが、トリガーは業界標準です)。履歴をメイン テーブルに格納しようとしないでください。それは正規化されたモデルを壊し、あらゆる種類の悲しみを引き起こします。

于 2010-10-12T12:57:21.083 に答える
0

あなたの質問で私が見たところ、データベース側で処理したいいくつかの制約があるようです。

• 利用可能な場所を保持するテーブルと、実際のクラスを含むテーブルがあります。

テーブルの設計についてさらに詳しく説明することができますが、これには、必要な情報を保持するためのテーブル スキーマが必要です。

• 各場所には独自のスケジュールがあります

挿入時にトリガーを作成して、スケジュールに挿入されているクラスが他のスケジュールと競合しないようにするのはどうですか?

• 各クラスは、いくつかの例外を除いて、いつでもどこでもスケジュールできます。 Aは12:00前または13:00以降にのみ配置できます, どこでも, 魔女には空き時間枠があります. クラスAを2か所で一度にスケジュールすることは禁止されています)

この制約もトリガーで処理します

• 時間枠のある 1 つの場所で 1 つのクラスにすることができます

この制約をトリガーで処理する

• モデルは、スケジュールされたクラスのバージョン管理/履歴をサポートする必要があります

スケジュール用に持っている実際のテーブルを反映する別のテーブルを用意してください。新しいレコードがメインテーブルに挿入されると、履歴を持つテーブルへの更新/挿入/削除の更新と時間をトリガーできます

これがいくつかのアイデアに役立つことを願っています。

-ビジェイ

于 2010-10-12T13:00:28.400 に答える