3

次のように、2つの列に親子関係を持つ「メモ」を表すデータベーステーブルを作成しています。

ID           INT(10) PK NOT NULL UNSIGNED ZEROFILL AUTOINCREMENT  -- Primary key
parent_ID    INT(10) UNSIGNED ZEROFILL                 -- References Primary key
username     VARCHAR(30) NOT NULL
information  VARCHAR(256) NOT NULL
comment      VARCHAR(256) NOT NULL

ここusernameで、はテーブルへの外部キー、userはメモを書いた人のユーザー名、はメモにinformation含まれる情報、は追加されたcommentものです。常に何かが含まれ、前のユーザーと同じである必要はありません。usernamecomment

コンセプトは、誰かがメモを「コピー」して自分のコメントを付け、「このメモはxxxから取得した」と言うことができるため、親子関係になります。おそらく、Facebookで共有するのと少し似ています。

parent_ID列を正しく形成するにはどうすればよいですか?識別関係を使用する必要があります。どちら側が必須ですか?5人が同じメモをコピーできるので、これは1対多の関係でなければならないと思います。

新しいメモを作成するよりもコピーが多いと予想されるためNULL、レコード内のの数は比較的少なくなりますが、nullを完全に取り除くには、制約を適用して、本質的に無意味なレコードを持つNOT NULLデフォルトの親を作成する必要があります。0ID 0、ソフトウェアでこれに注意しますか?

これも正しい方法ですか?次の2テーブルシステムを採用する必要があります。

ID          INT(10)      PK
information VARCHAR(256)
orig_user   VARHCAR(30)  FK  -- Potentially

ID          INT(10)      PK FK
username    VARCHAR(30)  PK FK
comment     VARCHAR(256)

定義によって可能なものを排除するNULLのはどれですか?

ありがとう

4

1 に答える 1

4

識別関係を使用する必要があります

いいえ、それだけでユニークなIDので、PKにのみ存在する必要があります。また、ルート(親のない)ノートにはNULLがあり、PKにNULLを含めることはできません。parent_ID

5人が同じメモをコピーできるので、これは1対多の関係でなければならないと思います。

正しい。複数のレベルのコピーが存在する可能性があるため、これもツリーです。

... NOT NULL制約を適用し、ID 0で本質的に無意味なレコードを持つデフォルトの親0を作成し、ソフトウェアでこれに注意する必要がありますか?

必要はありません。FKは引き続き0に適用され、すでに述べたように、それを満たすためだけに「ダミー」行が必要になります。FKはNULLを無視するため、ルートノートのにNULLを入れるだけparent_IDです。

2テーブルシステムを採用する必要があります...

これは同じことをモデル化したものではありません。元のユーザーに接続することはできますが、元のメモには接続できません。

1つのノートに複数の親が含まれる場合は、の2つのテーブルのデザインが実行可能ですが、ここではそうではないようです。

定義によって可能なNULLを排除するのはどれですか?

あなたはNULLを排除することに非常に熱心に見えます。その理由は何ですか?


全体として、次のように、メモを1つのテーブルに保存する必要があります。

CREATE TABLE note (
    ID           INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    parent_ID    INT(10) UNSIGNED,
    username     VARCHAR(30) NOT NULL,
    information  VARCHAR(256) NOT NULL,
    comment      VARCHAR(256) NOT NULL,
    FOREIGN KEY (parent_ID) REFERENCES note (ID),
    FOREIGN KEY (username) REFERENCES `user` (username)
);
于 2012-09-10T17:48:34.487 に答える