6

私のデータベース設計は以前はかなり直線的だったので、おそらく非常に簡単に解決できる問題に戸惑っています。

「CATEGORY」または「TOPIC」のいずれかの子である可能性のある投稿を含む「POSTS」のテーブルがあります。「POSTS」テーブルの外部キーを定義する最良の方法は何ですか?

POST_CATEGORY_ID という名前の列と "POST_TOPIC_ID" という名前のフィールドを持つことができると思いますが、これは null 可能である可能性がありますが、これは正しく聞こえません。確かに、私が見逃している簡単な解決策があります!

4

6 に答える 6

4

null 許容の POST_CATEGORY_ID および POST_TOPIC_ID フィールドを使用して正しい軌道に乗っています。これは、投稿がオプションでカテゴリに関連し、オプションでトピックに関連することをモデル化します。

これが排他的かつ必須であることが意図されている場合は、両方ではなくどちらかが null であるチェック制約を追加する必要があります。

于 2009-03-24T00:56:32.883 に答える
2

POST と CATEGORY および POST と TOPIC の間に多対多の関係を作成できます。

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)

このようにして、投稿を任意の数のカテゴリとトピックに関連付けることができます。

于 2009-03-24T00:58:31.113 に答える
1

外部キー宣言は単一のテーブルしか参照できないと思います:

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

私が正しければ、2 つの外部キーが必要です。1 つは CATEGORY テーブル用で、もう 1 つは TOPIC 用で、両方とも null 可能である必要があります。

于 2009-03-24T00:55:47.173 に答える
1

カテゴリとトピックを同じテーブルに置くのはどうですか

テーブルtopics_categoriesを作成します(ID番号、説明varchar2(100)、item_type char(1)); --C または T

次に、topics_categories への単一の外部キー

于 2009-03-24T00:58:29.990 に答える
0

最善の方法は、継承を使用することです。"Posts" には 2 つの特殊化があります: "Posts_Category" と "Posts_Topic" 両方とも "post_id" (親テーブル "Posts" に関連する) と別のフィールドがあります。

"Category_ID" ("投稿_カテゴリ")

"Topic_ID" ("Posts_Topic")

これが混乱していると思われる場合は、Doctrine (PHP ORM) のドキュメントを参照してください: http://www.doctrine-project.org/documentation/manual/1_0/en/inheritance

于 2009-03-24T00:57:17.483 に答える
0

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

于 2009-03-24T00:57:33.847 に答える