2012-05-05 51 views
0

我已經爲使用連接表的CakePHP框架創建了一個應用程序。SQL加入表 - 它需要一個主鍵還是唯一的鍵?

我不確定是否需要主鍵來唯一標識連接表的每一行,如第一個SQL塊所示。

是否需要將這兩個字段設置爲唯一鍵還是都可以將它們設置爲主鍵並將id作爲主鍵?

我也被問及爲什麼使用表約束來聲明原子主鍵而不是列約束,這是否意味着我不應該爲連接表設置唯一鍵?

CREATE TABLE IF NOT EXISTS `categories_invoices` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `category_id` int(11) NOT NULL, 
    `invoice_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `category_id` (`category_id`,`invoice_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=163 ; 

我在想解決辦法可能是同時設置鍵作爲唯一的和刪除主鍵如下所示:

CREATE TABLE IF NOT EXISTS `categories_invoices` (
     `category_id` int(11) NOT NULL, 
     `invoice_id` int(11) NOT NULL, 
     UNIQUE KEY `category_id` (`category_id`,`invoice_id`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

我的確在測試中刪除該主鍵「ID」連接表只留下'category_id'和'invoice_id',應用程序仍然工作。這已將這兩個字段作爲連接表內的唯一字段。這實際上是正確的做法嗎?

回答

6

你不需要兩者。化合物獨特的鍵可以代替主鍵(除非蛋糕框架不能與複合Priamry鍵處理):

CREATE TABLE IF NOT EXISTS categories_invoices (
     category_id int(11) NOT NULL, 
     invoice_id int(11) NOT NULL, 
     PRIMARY KEY (category_id, invoice_id) 
    ) 
    ENGINE = MyISAM 
    DEFAULT CHARSET = latin1 ; 

這也是好事,有另一個指標,以相反的順序,除了爲創建的索引主鍵:

INDEX (invoice_id, category_id) 

如果要定義外鍵約束,你應該使用InnoDB引擎。使用MyISAM您不能擁有外鍵。因此,這將是:

CREATE TABLE IF NOT EXISTS categories_invoices (
     category_id int(11) NOT NULL, 
     invoice_id int(11) NOT NULL, 
     PRIMARY KEY (category_id, invoice_id), 
     INDEX invoice_category_index (invoice_id, category_id) 
    ) 
    ENGINE = InnoDB 
    DEFAULT CHARSET=latin1 ; 

如果蛋糕不能用複合主鍵應對:

CREATE TABLE IF NOT EXISTS categories_invoices (
     id int(11) NOT NULL AUTO_INCREMENT, 
     category_id int(11) NOT NULL, 
     invoice_id int(11) NOT NULL, 
     PRIMARY KEY (id), 
     UNIQUE KEY category_invoice_unique (category_id, invoice_id), 
     INDEX invoice_category_index (invoice_id, category_id) 
    ) 
    ENGINE = InnoDB 
    DEFAULT CHARSET=latin1 ; 
+0

CakePHP不支持組合主鍵。如果你想直接操作你的連接表,那麼文檔說明我應該添加一個主鍵。但是我沒有這個要求,所以你提供的SQL是正確的解決方案?要將連接表的兩個字段都刪除爲主鍵? –

2

沒有什麼錯的第二種方法。它被稱爲組合鍵,在數據庫設計中非常常見,特別是在你的情況下。

http://en.wikipedia.org/wiki/Relational_database#Primary_keys

+1

CakePHP不支持組合主鍵。所以對於這個連接表,'category_id'和'invoice_id'都應該聲明爲主鍵? –