12

私が構築している StackOverflow に似たアプリケーションで、 my と table の関係を決定しようとしQuestionsAnswersCommentsます。

Questions単一のテーブルでAnswers両方を表すことができますPosts

これにより、Commentsへの単一の外部キーを持つことができますPosts

しかし、QuestionsAnswersが別々のテーブルである場合、これらのそれぞれにどのような関係が必要Commentsでしょうか?

更新: 選択された回答ではクラス テーブルの継承アプローチが推奨されており、これはデータベース用語では最良のアプローチのように思えますが、このオプションは Rails ORM ではサポートされていません。したがって、Rails では、私のモデルは単一テーブルの継承を使用する必要があり、おそらく次のようになります。

class Post < ActiveRecord::Base  
end  

class Question < Post  
  has_many :answers, :foreign_key => :parent_id  
  has_many :comments, :foreign_key => :parent_id  
end  

class Answer < Post  
  belongs_to :question, :foreign_key => :parent_id  
  has_many :comments, :foreign_key => :parent_id  
end  

class Comment < Post  
  belongs_to :question, :foreign_key => :parent_id  
  belongs_to :answer, :foreign_key => :parent_id  
end


class CreatePosts < ActiveRecord::Migration  
    def self.up  
      create_table :posts do |t|  
        t.string :type 
        t.string :author   
        t.text :content  
        t.integer :parent_id   
        t.timestamps  
      end  
    end  


    def self.down  
      drop_table :posts  
    end  
end
CREATE TABLE "posts" (
  "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,  
  "type" varchar(255),  
  "author" varchar(255),  
  "content" text,  
  "parent_id" integer,  
  "created_at" datetime, 
  "updated_at" datetime
  );
4

6 に答える 6

4

私が構築するソーシャルネットワークでは、私は少し違うことをします。あなたがそれについて考えるならば、コメントはサイトのほぼすべてのエンティティに添付される可能性があります。これは、ブログ投稿、フォーラムスレッドまたは投稿、記事、誰かの写真、人物プロファイル、サービスのベンダーなどです。このため、オブジェクトタイプ(テーブル参照)を保持するSystemObjectsテーブルを作成します。ほとんどの場合、コメントを受け入れるシステムのエンティティのレコードを作成しますが、これらはテーブルに直接マップされます。SystemObjectsテーブルには、SystemObjectIDと、将来の参照用のフレンドリ名(ルックアップテーブル)が格納されます。

これを配置したら、次に、どのテーブルを調べるかを示すSystemObjectID参照を持つCommentsテーブルを作成します。次に、参照されているテーブルのどのPKに関心があるかを示すSystemObjectRecordIDも格納します(すべての標準とともに)コメントデータ)。

私は、このSystemObjectテーブルの概念を、自分のサイトの他の多くの一般的な広範囲にわたる概念に使用しています。タグ、評価、コメント、およびサイト全体に添付され、すばやく使用できるように集約される可能性のあるその他のぶら下がっている果物について考えてみてください。

これについて詳しくは、私の著書ASP.NET3.5ソーシャルネットワーキングをご覧ください。

于 2009-06-12T16:43:57.310 に答える
2

2 つの外部キー (questions.questionID に対するものと、answers.answerId に対するもの) を持つ単一のコメント テーブルを作成できます。

于 2009-06-12T16:35:25.303 に答える
1

外部キー関係。QuestionComments と AnswerComments を使用するか、Comments に質問と回答の両方の外部キー列を含めることができます (これらの列を排他的にします)。

個人的には、Posts アプローチを使用します。

編集:検討中、うまくいくかもしれない3番目のアプローチがあります。コメント テーブルがあり、コメントを質問または回答のいずれかに関連付ける関連付けテーブルがある場合があります (したがって、コメントには ID とコメントがあり、結合テーブルには CommentID、AnswerID、および QuestionID があります。 )。または、Comments テーブルだけを作成してから、Answer-Comment 関連付けテーブルと別の Question-Comment 関連付けテーブルを作成することもできます。

于 2009-06-12T16:31:50.227 に答える
1

CommentsForQuestions と CommentsForAnswers の関係をまとめる 2 つのドメイン テーブルが必要です。基本的に、この目的のために 5 つのテーブルを作成する必要があります。

Questions
Answers
Comments
CommentsForQuestions (relates comments to questions)
CommentsForAnswers (relates comments to answers)

これが持つ 1 つの問題は、参照整合性がそれほど強力ではないため、投稿のアイデアよりも劣っていることです。CommentsForQuestions がコメントと質問に接続することは保証できますが、質問と回答の両方が同じコメントに接続されるのを防ぐことはできません。

于 2009-06-12T16:31:08.510 に答える