2016-12-04 4 views
0

私は、データベースにそうではないと私は、次の疑問があります。宿泊施設サービスの客室料金を表すこのSQLテーブルのキーを設定する最適なソリューションは何ですか?

id     bigint(20) unsigned NO PRI  NULL auto_increment 
rate_name    varchar(255)   NO   NULL  
rate     double    NO   NULL  
date_from    datetime    NO PRI  NULL  
date_to    datetime    NO PRI  NULL  
id_room_tipology_fk bigint(20) unsigned NO PRI  NULL  
time_stamp   datetime    YES   NULL  

私は主キーがあることがあります。

を私が宿泊システムのレートreserverationsを表すこのroom_rateテーブルを持っています

1)id:自動増分IDで構成されています。

2)date_from:開始日。

3)date_to:校正日。

4)id_room_tipology_fk:部屋のティポロジー別のテーブルへのリンク。

このテーブルのレコードは単にDATE_FROMDATE_TO日付で表される時間の特定の範囲内(id_room_tipology_fkによって表される)部屋のtipologyにbeloning部屋のコストでどれだけ表現します。

同じ部屋のティポロジーに同じ時間帯のテーブルに2つのレコードがあることを避けたいと思います。

以前の主キーサブセットを使用しているかどうか、またはidフィールドを除外する必要があるかどうかを確認しています。私は、同じ期間に同じ部屋のtipology(5)のための2率を持つことができないので

1 rate1 50 01/01/2017 10/01/2017 5 04/12/2016 
2 rate2 70 01/01/2017 10/01/2017 5 06/12/2016 

は基本的に私はこのようなものを持つことはできません。

この状況を正しくモデル化する最良の解決策は何ですか?

+0

時間範囲を処理するには、MySQLでトリガーを使用する必要があります。 –

+0

@GordonLinoffいいえ、たぶん私ははっきりしていませんでした...レコードは、特定の時間帯に部屋のコストがどれくらいあるかを表しています。部屋の賃貸人は同じ時間範囲に同じ価格を挿入することはできません...これは私が – AndreaNobili

+0

@GordonLinoffをモデル化しなければならない制約ですか、何か不足しているかもしれませんか? – AndreaNobili

答えて

0

コメントの説明に基づいて、一意のインデックス/制約を使用できます。

これは開始日のみを使用しますが、終了日も含めることができます。

あなたが好む場合は、テーブル定義に同じチェックを入れることができます。テーブルには、これまでDATE_FROM-DATE_TOが重複して同じid_room_tipology_fkを持っていないと仮定すると

constraint unq unq_roomrate_room_datefrom unique (id_room_tipology_fk, date_from); 
0

範囲:

が、 (id、date_from、date_to、id_room_tipology_fk)はnullではなくユニークかもしれませんが、それは主キーではありません。 (id)、(date_from、id_room_tipology_fk)と(date_to、id_room_tipology_fk)はすべて行を一意に識別し、いずれかのサブセットは一意ではないので、それらはすべて候補キー(nullでないと宣言)代わりに主キーとして宣言します。

各interval-id_room_tipology_fkペアは一意であるため、表示される1つの行にある1つのレートでのみ表示されるため、制約を追加する必要はありません。

しかし、重複しないことが保証されていない場合は、トリガーで宣言した制約で強制する必要があります。質問&の回答はFind date range overlaps within the same table, for specific user MySQLです。

関連する問題