2009-03-24 17 views
6

私のデータベース設計はこれまでは線形でしたので、おそらく非常に簡単に問題を解決するのが難しいです。複数の外部キー

私は、「CATTSORY」の表を持っています。この表には、「CATEGORY」または「TOPIC」の子でもよい投稿が含まれています。 "POSTS"テーブルの外部キーを定義する最善の方法は何でしょうか?

私はPOST_CATEGORY_IDという名前の列とNULL可能かもしれない「POST_TOPIC_ID、という名前のフィールドを持つことができたとしますが、これはちょうどいい音ではありません。確かに私は欠けている簡単な解決策がある!

答えて

2

topics_categoriesに単一の外部キー:

POST 
---- 
ID 
Text ... 
... 

CATEGORY 
-------- 
ID 
Name 

TOPIC 
----- 
ID 
Name 

POST_CATEGORY 
------------- 
POST_ID (FK) 
CATEGORY_ID (FK) 

POST_TOPIC 
---------- 
POST_ID (FK) 
TOPIC_ID (FK) 

この方法は、ポスト任意の数のカテゴリおよびトピックに関連付けることができます。

+0

これは、少なくとも中間的なテーブルの観点から、より拡張性がありますが、POSTSテーブルからnull許容列を取り出して、新しいテーブルを作成するだけではありませんか? –

+0

私はあなたがこれを行う場合nullablesは必要ないと思います。関係が存在する場合は、多対多のテーブルにレコードを挿入するだけです。 –

+0

分待ってください - 私は今後に続くと思います。ですから、将来私は、子のPOSTSを必要とするBOOKSという新しいテーブルがあるとします。私はPOSTSとBOOKSに外部キーを持つPOST_BOOKというテーブルを追加しますか? –

1

私が正しいんだ場合、あなたは2つの外部キー、CATEGORYテーブル用とTOPICための別のものを持っている必要があります

FOREIGN KEY(CATEGORY_ID) REFERENCES CATEGORY(CATEGORY_ID); 
FOREIGN KEY(TOPIC_ID) REFERENCES TOPIC(TOPIC_ID); 

、および両方の必要性:私は、外部キーの宣言は、単一のテーブルを参照することができると思います

4

あなたは正しい軌道に乗っていますh nullable POST_CATEGORY_IDおよびPOST_TOPIC_IDフィールド。これは、オプションでポストがカテゴリに関連し、オプションでトピックに関連していることをモデル化します。

これは排他的で必須である場合は、nullであるが両方ではないチェック制約を追加する必要があります。

+0

これについて私に気になることは、後で他のものにPOSTSが含まれている場合です。私は新しいテーブルを参照する別のnull可能な列をサポートするために、テーブルを変更する必要があります。私はそれをすることから免れない、それはちょっと離れているようだ。 –

0

最も良い方法は、継承を使用することです。あなたは、「投稿」の2つの専門分野を持っています :

「CATEGORY_ID」(「Posts_Category」:「Posts_Category」と「Posts_Topic」 の両方が(親テーブル「記事」に関連する)「post_idの」と別のフィールドを持っています)

"Topic_ID"( "Posts_Topic")

これが彼らのドキュメントでドクトリン(PHP ORM)を見て混乱聞こえる場合: http://www.doctrine-project.org/documentation/manual/1_0/en/inheritance

0

データベースに外部キーを定義したい場合は、あなたが提案している解決策右のように聞こえる。私はまた両方のフィールドがnullでないことを確認するトリガでいくつかのコードを書くことをお勧めします。

1

どのように同じテーブルのカテゴリおよびトピックを有する約

( ID番号、 説明VARCHAR2(100)、 ITEM_TYPEチャー(1))表topics_categoriesを作成します。 - CまたはT

その後、あなたは多対多のPOSTおよびCATEGORYとPOSTとTOPIC関係行うことができます