Database Design - Column In One Table References Two Tables

谁说胖子不能爱 提交于 2019-12-10 15:38:33

问题


Here is an example of what I have (take Stack Overflow). I have 2 tables, Questions and Answers. I also have a Comments table. The Comments table will reference both Questions and Answers.

How should I set up the database? Have 2 columns in Comments, a QuestionId and AnswerId. Have one table for both Questions and Answers? Have a table in between that somehow tells me Question or Answer?

EDIT: Found the SO Data explorer, it uses one table for both Questions and Answers ... I just don't like the POSTS table having so many NULLS in it. Does that have any negative effects, like on performance?


回答1:


StackOverflow models the questions and answers as being the same entity: POSTS. They have identical properties, aside from indicating the answer where accepted/granted.

Comments get their own table, and relate to the respective post using a foreign key -- the post_id.

Without needing to load the monthly SO dumps, you can view (and query) the SO schema via the StackExchange Data Explorer.




回答2:


Create another relation Post_Type to keep track of whether the ID in your Comments table is a question or an answer.

post_type varchar(20) NOT NULL,
post_type_id tinyint PRIMARY KEY,

Then in your Comments table, add Post_Type.post_type_id as the foreign key, in addition to the attribute that keeps track of your Question Id/Answer Id.

You won't need two columns (QuestionId + AnswerId) in the Comments table, because that will give you null in either columns, in your scenario problem domain.

Cheers.




回答3:


You mean you can have comments on both questions and answers? You will have 5 tables:

question
answer
comment
question_comment
answer_comment

The table question_comment will have a comment_id and a question_id. Similar deal with answer_comment.



来源:https://stackoverflow.com/questions/3887256/database-design-column-in-one-table-references-two-tables

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!