论坛的表设计

时间:2012-10-13 09:55:23

标签: php mysql forum organization

要明确,我 在这里寻找设计整个论坛的人,相反,我需要一些帮助来确定如何关联几个表,以及这些表格是否需要首先存在。

论坛的基础知识

主题

topic_id // Unique topic ID, AI, PK
topic_name // name of the topic
... etc
  • 主题
  • 这些主题中的帖子(这就是这里的帖子
  • 回复帖子,这是下面的回复(您的回复)

用户

user_id // Unique ID of the user, PK, AI
user_name
user_pass
user_email
user_date

帖子

post_id // unique ID of post - PK, AI
post_content
... etc

我还希望包含喜欢/不喜欢帖子的能力,因此我创建了一个表post_ranking,如下所示

id // Auto increment ID    
post_id  // Foreign key, refers to post.post_id
user_id  // Foreign key, refers to user.user_id
vote_up  // Whether or not the post was voted up (0 for down, 1 for up)
rank_date // date the ranking occured

我遇到的问题是我无法弄清楚如何将回复纳入此表。到目前为止我唯一想到的选择就是创建一个名为reply_ranking的第二个表 - 但这不会有点无组织吗?

所以,我的问题:

我应该为排名创建两个单独的表(post_rankingreply_ranking)还是我应该采用另一种方法来安排上面的表格,从而避免出现这个问题?

3 个答案:

答案 0 :(得分:0)

我通常会这样想:

一个用户有很多帖子(这意味着您需要一个users表和一个posts表,每个帖子都会有一个user_id来表示谁拥有它

对于某些关系,(例如,当您意识到A 有很多 B而B 有很多 A时,我们可以 n到n 关系),你需要第三张桌子;这可能是您在评论中暗示的,回复实体应该在您的数据库中翻译成什么......

随意提交错误...几乎从来没有你最终会得到与你开始时完全相同的模型......在我们做之前我们不知道需要做很多事情。

答案 1 :(得分:0)

你可以做的另一件事就是制作一个单一的排名表,其中一个字段指示upvote / downvote是用于帖子还是排名。您将不得不使用非唯一泛型“item_id”而不是post id或reply id,但如果这对您很重要,您将获得一个表。

编辑:刚才意识到外键字段无论如何都是非独特的,因为你可能对同一个帖子有多个投票;关键是post id和回复id不能分开。

这将使得查询表格变得更加困难。我建议你按照现行计划制作两张桌子;它是您组织数据的最具语义的方式。

答案 2 :(得分:0)

你的帖子不是很清楚,我无法理解你在表格中的主题是否也在该主题中发帖并回复该主题。

在这种情况下,我认为这不是好方法,你应该将帖子与主题数据分开。让我解释一下。

论坛由:

组成
//                MAIN PAGE, showing avaible forums
//                    |
//              SPECIFIC FORUM, that show the threads (or topics) inside
//                    |
//                  POSTS that show part of the post related to that thread.
//
//       USER_CP -------------- ADMIN_CP

我们至少需要4个表(我不考虑admin_cp)。 这些是:

//  TOPICS:
//  +---------------+---------+-------------+----------+----------+----------------+
//  | ID, p.k. a.i. |  TITLE  |  SUB_TITLE  |  AUTHOR  |  CLOSED  |  PARENT FORUM  |
//  +---------------+---------+-------------+----------+----------+----------------+
//
//  These are very few basic field for the table. No reference about the posts here.
//
//
//  FORUMS:
//  +---------------+---------+-------------+--------------+
//  | ID, p.k. a.i. |  TITLE  |  SUB_TITLE  |  VISIBILITY  |
//  +---------------+---------+-------------+--------------+
//
//  Almost clear, visibility is a value to determine if the forum is private (such are
//  forums like: "Moderator rooms" or "Admin stuff"), protected (i.e. for non registered
//  users, or if the forum is public.
//
//
//  POSTS:
//  +---------------+----------+-------+-----------+--------+---------+-------+- - -
//  | ID, p.k. a.i. | TOPIC_ID | TITLE | SUB_TITLE | AUTHOR | MESSAGE | VOTES | ...
//  +---------------+----------+-------+-----------+--------+---------+-------+- - - 
//  
//  In Votes you have a integer number (positive o negative, no matter) with the total
//  of the votes for this post (not useful if you fully use the table like).
//
//  REPLIES
//  +---------------+----------+---------+--------+---------+
//  | ID, p.k. a.i. | TOPIC_ID | POST_ID | AUTHOR | MESSAGE |
//  +---------------+----------+---------+--------+---------+
//
//
//  USERS
//  +---------------+------+------+------------+------+---------+- - - - -
//  | ID, p.k. a.i. | NICK | PASS | PRIVILEGES | NAME | SURNAME | ETC..
//  +---------------+------+------+------------+------+---------+- - - - -
//
//  Privileges determinate if a user is admin, mod, super_mod or simple user
//
//
//  LIKES
//  +---------------+---------+---------+----------+----------+---------+------+
//  | ID, p.k. a.i. | USER_ID | POST_ID | TOPIC_ID | REPLY_ID | UP_DOWN | DATE |
//  +---------------+---------+---------+----------+----------+---------+------+

在我看来,这是你应该使用的结构。

主页,显示所有论坛:

  • 阅读用户的权限
  • 阅读表WHERE visibility >= user_privileges
  • 中的论坛数据
  • 用适当的链接隐藏每个论坛。

论坛页面,显示所有主题(和主持人):

  • 阅读表WHERE parent_forum = forum_id
  • 中的主题
  • 阅读此论坛的版主
  • 通过适当的链接隐藏主题
  • 显示页面底部的主持人。

主题页面,显示所有消息。

  • 从表格中读取topi数据。
  • 主题也是第一条消息!
  • 阅读表WHERE topic_id = current_topic_id
  • 中的帖子
  • 从表格“LIKES”WHERE post_id = selected_post
  • 中读取的每个帖子
  • 总结所有选票
  • 以适当的页面和适当的投票来填补帖子。

用户页面:

  • 阅读所有数据WHERE id = user_id_that_want
  • 从“LIKE”WHERE user_id = actual_user
  • 中读取
  • 你有所喜欢/不喜欢用户发送的内容。做你想做的事。
  • impaginate

使用此表结构,您还可以使用StackOverflow类似的方式来考虑投票,即UPvotes对于选民来说是0,但是对于选民而言downvote是-1。对于每个帖子,您可以使用post_id从类似的表中读取,因此您知道有多少票有帖子(向上和向下),并且您可以计算投票+10到帖子创建者,downvote -5到帖子创建者。

仅使用额外的表格。

你可以:

  • 对某个主题进行投票
  • 投票
  • 投票回复
  • 投票总数(回复+帖子+主题)。

当您插入主题时,您将添加:

user_id
topic_id = topic id
post_id = -1 (this is not a post, is the topic!)
repl

y_id = -1(如上所述)

插入帖子时:

user_id
topic_id = current topic
post_id = post_id
reply_id = -1 (this is not a a reply)

当您插入回复时

user_id
topic_id = current topic
post_id = current post
reply_id = the reply id.

这不会有id问题。因为三者是分开的。

如果您要求提供特定主题和特定帖子的所有答案,请添加:

WHERE topic_id = current, post_id = current

如果您需要回复主题,只需输入post_id = -1

即可

等等。 没有问题ids!

我想我已经解释了几乎全部。对于任何问题,请问! 编辑:这里和那里的东西