12 Stimmen

In einem StackOverflow-Klon, welche Beziehung sollte eine Kommentare-Tabelle zu Fragen und Antworten haben?

In einer Anwendung, die StackOverflow ähnelt und die ich gerade aufbaue, versuche ich zu entscheiden, welche Beziehung meine Questions , Answers y Comments Tabellen haben sollten.

Ich könnte Questions y Answers beide durch eine einzige Tabelle dargestellt werden Posts .

Dies würde es ermöglichen Comments mit einem einzigen Fremdschlüssel zu Posts .

Aber wenn Questions y Answers getrennte Tabellen sind, welche Beziehungen sollten Comments zu jedem dieser Punkte haben?

UPDATE: Obwohl die gewählte Antwort einen Class Table Inheritance-Ansatz empfiehlt und dies aus Sicht der Datenbank der beste Ansatz zu sein scheint, wird diese Option vom Rails ORM nicht unterstützt. In Rails müssen meine Modelle also Single Table Inheritance verwenden und werden wahrscheinlich wie folgt aussehen:

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
  );

1voto

David Punkte 5186

Es gibt 2 Möglichkeiten, die mir einfallen.

Verwenden Sie zunächst eine weitere Spalte in der Tabelle Kommentar, um anzugeben, ob der Kommentar zu Frage oder Antwort gehört. So wird der PK der Tabelle "Comment" zum Fremdschlüssel für "Question" oder "Answer" und "PostType" kann z.B. 1=Question und 2=Answerts sein.

Zweitens: Verwenden Sie für jede Frage und Antwort eine Beziehungstabelle. Sie haben also eine Tabelle mit Fragen, Antworten, Kommentaren, QuestionComment und AnswerComment.

Angenommen, der Primärschlüssel der Tabellen Question, Answer und Comment lautet QuestionID, AnswerID bzw. CommentID. Dann würden die Spalten von QuestionComment [QuestionID, CommentID] lauten. Analog dazu wären die Spalten von AnswerComment [AnswerID, CommentID].

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X