2016-08-22 36 views
3

我自學成功進行數據庫設計和MYSQL。謝謝你看我的問題。我現在有一個數據庫看起來像這樣在mySQL使用其他唯一約束創建代理鍵表

enter image description here

我用一個組合鍵的原因是我要保持OwnerDevName唯一所有的時間。 我可以看到的一個問題是,我需要始終使用兩個外鍵,所以Data1表未標準化。

所以我做了一個表,看起來像這樣,使另一個表具有代理鍵表。

enter image description here

這看起來好嗎?我不知道做新表確實是個好主意......

有什麼讓他們在具有代理鍵一個表,保持的OwnerDevName獨特的像這樣的組合?:

enter image description here

回答

3

Device3Data3看起來不錯。除非有一些令人信服的理由,否則我不會添加額外的表格。創建第三張表的任何令人信服的理由可能歸結爲處理複合外鍵,就像在原始的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'具有獨特的組合,我不符合我的要求。但它實際上效果不錯:)謝謝。 只是一個簡單的問題,所以'UNIQUE INDEX'和'UNIQUE KEY'是相同的嗎?沒有區別? –

+1

是的,在MySQL中完全相同。 (其他數據庫區分了唯一的CONSTRAINT和唯一的INDEX,例如,Oracle允許使用非唯一索引強制執行一個唯一的約束,但(MySQL)InnoDB存儲引擎不會這樣做,您需要創建一個在MySQL中,這兩個語句是等價的:'ALTER TABLE foo ADD CONSTRAINT foo_UX1 UNIQUE KEY(bar,baz)'和'CREATE INDEX foo_UX1 ON foo(bar,baz)' – spencer7593

+0

非常感謝許多! –