2016-08-22 10 views
3

私はデータベース設計とMYSQLのために独学です。私の質問を見ていただきありがとうございます。私は現在、データベースがmySQLに次のようになります持っています:他の一意の制約を持つ代理キーテーブルの作成

enter image description here

私は複合キーを使用した理由は、私がOwnerDevNameユニークなすべての時間を維持したいです。 私が見ることができる1つの問題は、常に2つの外部キーを使用する必要があることです。Data1テーブルが正規化されていません。

私はこのように見て、サロゲートキーテーブルを持つ別のテーブルを作成しました。

enter image description here

これは大丈夫見ていますか?私は、新しいテーブルを作ることは本当に良いアイデアであることを確認していない...

は、任意のOwnerと、このようなユニークなDevNameの組み合わせを保ち、代理キーを持つ単一のテーブルにそれらを作るためにあるの?:

enter image description here

答えて

3

Device3およびData3は私によく見えます。何か説得力のある理由がなければ、私は余分なテーブルを追加することで混乱することはありません。そして、おそらく3番目のテーブルを作成する魅力的な理由は、オリジナルのDevice/Data1モデルのように、複合外部キーを処理することだけです。

UNIQUE制約はすべて不足しているようです。 ownerdevname列の組み合わせにUNIQUE制約(つまりUNIQUE INDEX)を追加できます。例えば

CREATE TABLE device3 
(id  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY 
, owner VARCHAR(30) NOT NULL COMMENT '' 
, devname VARCHAR(30) NOT NULL COMMENT '' 
, ... 

, UNIQUE KEY device3_UX1 (owner, devname) 

) ... 

それとも、あなたはすでにdevice3表が作成されている場合、あなただけの既存のテーブルに一意のインデックスを追加する追加することができます。例えば

CREATE UNIQUE INDEX device3_UX1 ON device3 (owner, devname) 
+0

ありがとうございました。ああ、私はクエリが 'id'、' owner'、 'devname'の組み合わせをユニークにしていると思っていました。しかし、それは実際にうまくいく:)ありがとう。 「ユニークインデックス」と「ユニークキー」は同じですか?違いはありません? –

+1

はい、MySQLと同じです。 (他のデータベースでは、一意のCONSTRAINTと一意のINDEXを区別します。たとえば、Oracleでは一意でないインデックスを使用して一意の制約を適用できますが、(MySQLの)InnoDBストレージエンジンはそれを行いません。 MySQLでは、これらの2つのステートメントは同等です: 'ALTER TABLE foo ADD CONSTRAINT foo_UX1 UNIQUE KEY(bar、baz)'と 'CREATE INDEX foo_UX1 ON foo(bar、baz)'。 – spencer7593

+0

ありがとう多く! –

関連する問題