2012-11-21 45 views
5

コメントが付いた2つのテーブルと返信付きの1つのテーブルを作成したいと思います。しかし、返信に返信することができれば、どのように変更する必要がありますか?これは私が1対多に持っているものですが、返答のための返答があるかどうかはわかりません。コメントと返信用のデータベース設計

Comments: 
• Id 
• Title 
• Text 

    Replies: 
• Id 
• Title 
• Text 
• Comment id 

ありがとうございます。

+0

デザインは正規化されていますので、先に進む必要があります。 両方のテーブルにcreaterのIDとなるuserIdが必要です。 返信の返信は論理的なシナリオです。その実装は、返信先のステータスが –

+0

のユーザーIDと同じですか? 「ユーザー」はどこに参照されていますか? – mcalex

答えて

11

ParentIDフィールドを含むテーブルを1つだけ使用できます。レコードに値がない場合はコメント、それ以外の場合はコメントまたは返信です。

レコードのParentIDレコード( ParentID)を照会して、この返信がコメントであるか返信であるかを確認できます。

を編集してください:上記はかなり実用的な解決策です。ただし、正規化されたバージョンを使用するには、1つのCommentsテーブル(ParentIDなし)を保持し、CommentIDとResponseIDを持つReplyToテーブルを作成します。両方ともCommentsテーブルのレコードのIDです。このアイデアを使用して

、次のSQLコメントがあり、各回答に対するコメントと各コメントに「返信」が表示されます:

select c.comment, r.comment as reply 
from comment as c, comment as r, replyto as rt 
where c.ID = rt.CommentID 
and r.ID = rt.ReplyID 

Dimitriiが指摘するように、それはとのコメントが表示されませんあなたは外部結合クエリが必要です(構文をテストしませんでした):

SELECT c.comment, r.comment as reply, 
from Comment c 
    left outer join Comment r on c.id = r.id 
    left outer join replyto rt on rt.responseid = r.id 
+0

彼はできますが、彼のデザインはより標準化されています... –

+1

私はmcalexに同意します。それを2つのテーブルに分割することは、無駄なく複雑になります。正規化の理由から複数のテーブルに分割する場合は、スレッドテーブルを作成し、次にコメントのテーブル(元のコメントと返信の両方)を作成します。 しかし、通常は返信を取得するためにデータベースへの再帰呼び出しが必要になり、返信などへの返信が必要になります。入れ子セットモデルを使用して実行できます。 – Kickstart

+0

アレックスに感謝します。両方のソリューションがうまくいくと思いますが、全体的なパフォーマンスが向上すると思いますか? – grasshopper