2012-05-05 14 views
0

私は、結合テーブルを使用するCakePHPフレームワーク用のアプリケーションを作成しました。SQL Join Table - プライマリ・キーが必要か、ユニーク・キーのみが必要ですか?

SQLの最初のブロックに示すように、結合テーブルの各行を一意に識別するために主キーが必要であるかどうかは不明です。

2つのフィールドを一意のキーとして設定する必要がありますか、または両方をプライマリキーとして設定し、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は複合主キーをサポートしていません。ジョインテーブルを直接操作したい場合は、プライマリキーを追加する必要があります。しかし、私はこれのためのrequirmentを持っていないので、あなたが提供したSQLは正しい解決策ですか?主キーとして結合テーブルの両方のフィールドをdelcareするには? –

2

第二の方法は何も問題はありません。これは複合キーと呼ばれ、データベース環境、特に状況によっては非常に一般的です。

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

+1

CakePHPは複合主キーをサポートしていません。したがって、この結合テーブルでは、 'category_id'と' invoice_id'の両方を主キーとして宣言する必要がありますか? –

関連する問題