2011-02-02 4 views
0

私は、各イベントを定義するために、さまざまなタイプのサブテーブルとイベントのテーブルを持っています。これは十分な主キーですか?

イベントテーブルには、ID、潜在的に一意でないDatetime、userId、およびイベントタイプコードがあります。

イベントタイプテーブルの場合、ExerciseStart ...は適切な主キーEventIdですか?各イベントは1つのタイプなので、これは決して倍増しません。誤って倍増するのを避け、潜在的にクエリー・ライティングを簡単にするために、おそらく複合主キーとして、サブカテゴリーにdatetimeを含めると便利ですか? (それはまた私が感じる重複しているだろうが)。

(私は複合キーとして日時およびイベントタイプコードを使用していたが、それは私に多くの潜在的に危険なようでない限り)

+1

テーブルの構造に関するいくつかの特質を使用すると役立ちます。違うノートでは、サロゲートキー(EventIdが自動インクリメント値であると仮定しています)を使用するたびに、PK以外のカラムで構成されるテーブルに対して別のユニーク制約を定義する必要があります。たとえば、イベントテーブルで、イベントを一意に識別するその他の情報:DateTime、UserId、TypeCodeを組み合わせたもの – Thomas

+0

User/DateTime/Typecodeは理論的には一意でなければなりません。私はまだすべてのための合成キーを持っていないことに慣れていません、それは私が学校でどのように教えられ、何年もしてきたことです。ここに特定のデータベースに関する詳細情報があります:http://stackoverflow.com/questions/4801628/one-table-or-many-for-many-different-but-interacting-events – Damon

+1

@Damon、悲しいことに、管理コースは、データベース設計において鍵の賢明な使用を教えることに全く失敗している。私は、代理キーだけを検討する価値があることを学んだように見えるあなたのような人たちを見つけました。成功した結果を得るためには、自然キーがはるかに重要である現実の世界では、これは実用的ではありません。 – sqlvogel

答えて

0

私は何が必要だと思うクラステーブルinteritanceと呼ばれている: あなたが含まれているenvent_tableを持っていますすべての共通のプロパティとさまざまなタイプのイベントの多くのタブレ

それはこのようなものが考えられます。「継承」または「サブクラス」を行うための通常の方法は、化合物の(event_type, event_ID)上のキーと用途を持つことである標準SQLを使用して

CREATE TABLE events(
    event_id SERIAL PRIMARY KEY, 
    ... other fields 
); 

CREATE TABLE event_typeN(
    event_id BIGINT UNSIGNED PRIMARY KEY, 
    ...other fields, 
    FOREIGN KEY(event_id) REFERENCES events(event_id) 
); 
+0

私はそれのようなものを持っています。私の質問は、私のevent_typeNテーブルに本当にプライマリキーが必要かどうかということです。なぜなら、各イベントにはそれぞれ独自のキーを持つ別個の親があるからです。なぜなら、外来キーを使わないだけです。 – Damon

+0

イベントの種類が異なるテーブルは、キー(ほぼすべてのタルブ)のように、typeNにevent_idを主キーとして持つことはOKです。 @onedaywhen。 – Oleg

0

...

制約を持つ参照 'サブタイプ'テーブルのこのキーは、event_typeがその 'サブタイプ'に適切であることを保証します。 CHECK (event_type = 'Exercise start')

「サブタイプ」テーブルのevent_type DEFAULTをもう一度適切なタイプに一致させることです。 event_type VARCHAR(20) DEFAULT 'Exercise start' NOT NULL

構造は次のようになります。

CREATE TABLE EventTypes 
(
event_type VARCHAR(20) NOT NULL PRIMARY KEY 
); 

CREATE TABLE Events 
(
event_ID CHAR(10) NOT NULL, 
event_type VARCHAR(20) NOT NULL 
    REFERENCES EventTypes (event_type), 
event_date DATE NOT NULL, 
PRIMARY KEY (event_type, event_ID) 
); 

CREATE TABLE ExerciseStartEvents 
(
event_ID CHAR(10) NOT NULL, 
event_type VARCHAR(20) DEFAULT 'Exercise start' NOT NULL 
    CHECK (event_type = 'Exercise start'), 
FOREIGN KEY (event_type, event_ID) 
    REFERENCES Events (event_type, event_ID), 
PRIMARY KEY (event_type, event_ID), 
exercise_description VARCHAR(30) -- etc -- 
); 

しかし、それはCHECK制約を強制しないことにMySQLで大きな問題がある:([誰もがこのような状況に耐えることができますどのように私を超えている!]だから、あなたの質問に答えるには、event_IDだけのキーを持っているだけでは適切ではありません。

event_IDが候補キーになるように誘惑しているかもしれませんサブタイプテーブルでは、これは良い考えではないかもしれません。 ouldは与えられたevent_IDがテーブルに現れるように1つの行だけを許可します。もしその行のタイプが間違っていれば、正しいタイプの行が挿入されないでしょう!

解決策?より良いSQLインプリメンテーションに移動する)

+0

IDキーが「重複を防ぐ」方法を説明できますか? – PerformanceDBA

+0

だから、「IDキーが重複を防止する」という文は、明らかに偽です。 – PerformanceDBA

+0

「重複を防止する」理由は、データベースを使ったプログラミングでは、1つの特定のレコードを返す必要があり、合成自動インクリメントの主キーを使用する必要がある状況があります。何があっても1つ戻る。 IDキーは、多くの開発者にとって最も懸念される特定の種類の重複を防止するということを私が理解する方法です。 dbデザイナーにとって懸念されるものではありません。 – Damon

関連する問題