2010-12-13 11 views
0

私はいくつかの場所でいくつかの場所でナイトクラブのデータベースをモデル化しようとしています。私はVenueScheduleは、これらの間のテーブルに参加されることを考え出し、あなたはどの会場で演奏しているバンド見上げることができるように、主キーは、venue_idband_idだろう、私のデータベースにデータベース設計:3フィールドの複合主キーよりも優れた方法はありますか?

Venues 
Bands 
VenueSchedule 

を3つのテーブルを作成しました。しかし、しわには、そのバンドで演奏されたバンドと、特定の日に特定の会場で演奏されるバンドを照会できるようにする必要もあります。

VenueScheduleテーブルのプライマリキーには2つのフィールドがあります。私がdateフィールドを主キーに追加するのは悪い習慣でしょうか?これよりも良い方法がありますか?

答えて

3

あなたは自分のデータよりも優れていることは知っていますが、(venue_id、band_id、date)がVenueScheduleの最も重要な鍵になると思います。 (venue_id、band_id)は、各バンドが各会場を1回しか演奏することができない、またはその日付が必要でないことを意味する。

他の返信で提案されているように、代理キーの使用については慎重であることをお勧めします。まず、サロゲートキーは複合キーと同じ仕事をしません。サロゲートが同じ会場、バンド、日付の組み合わせを複数回挿入することを止めないため、データの整合性が維持されません。これは潜在的な更新の異常を引き起こし、不正確な結果につながる可能性があります。

第2に、サロゲートキーが必要な場合、またはその使用方法がわからない理由は明らかです。 テーブルが別の場所で参照されている場合代理人を使用したい場合は、代用キーを使用しないと、代理キーが余分な重量とストレージの複雑さとなり、すべて。

+0

あなたは有効なポイントを作る。私は同じ考えを持ち、データの重複を避けたいので、コンポジット・キーを使うことになります。これは、2つのテーブル以外のどこからでも参照できない非常に単純な結合テーブルです。 – picardo

+1

"あなたは自分のデータを私よりもよく知っています"。多くのQ&Aスレッドで優れた点。私はそれを恥知らずに盗もうと思う。 –

1

代わりに代理の主キーと固有の制約があります。

3

私はこれをしません。 SQL Serverのアイデンティティーのような代理キーを使用します。サロゲートの方が検索が高速になり、FKテーブルはこれらの3つのカラムを各FKテーブルに追加する必要がないため、より効率的に小さくなります。ほとんどの場合、私はサロゲートを使用するのは大好きですが、サロゲートがテーブルの他のカラムとの関係がないため、データベースの純粋主義者は強く反対します.IOWは、厳密にPKに使用されるアーティファクトなカラムです。私はこのポジションを理解していますが、私はそれらを使用して、とにかくそれらを推奨します

+0

SQLiteでサロゲートを作成する方法は知っていますか?私はグーグルではなく、おそらくそれは別のものと呼ばれています。 – picardo

+0

@picardo - SQLLiteでは、INTEGER PRIMARY KEYと宣言された列が自動的にインクリメントされます。次に、この列にNULLを格納すると、挿入時に自動的に増分されます。 –

+2

このアドバイスに従うと、重複を防ぐために(venue_id、band_id、およびdate)にもUNIQUE制約が必要です。 –

1

ストレージではなく、データを取得するのと同じように聞こえます。必要なデータを提供するビューを設定するか、データウェアハウスを使用して非正規化された方法でデータを格納することは、レポートのニーズを満たすためのオプションです。

人工主キーを持つテーブルを使用することをお勧めします。このテーブルはこれら3つの他の参照先(会場、バンド、会場)を指していますので、このようにして、データを取得するために他の3つにリンクするこのクエリを使用してクエリを書くことができます。

2

サロゲートキーの大きなファン(Id)でも、データを複製するのが非常に簡単であるため、「依存エンティティ」でそれらを避ける傾向があります。 ScheduleテーブルにIDを追加する場合は、(VenueId, BandId, Date, Status)に一意制約が必要で、別のインデックスがDBに追加されます。

私はStatusフィールドを追加してキャンセルされた公演を可能にしました。

alt text

関連する問題