要明确,我 不 在这里寻找设计整个论坛的人,相反,我需要一些帮助来确定如何关联几个表,以及这些表格是否需要首先存在。
论坛的基础知识
主题
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_ranking
,reply_ranking
)还是我应该采用另一种方法来安排上面的表格,从而避免出现这个问题?
答案 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
主题页面,显示所有消息。
WHERE topic_id = current_topic_id
WHERE post_id = selected_post
用户页面:
WHERE id = user_id_that_want
WHERE user_id = actual_user
使用此表结构,您还可以使用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!
我想我已经解释了几乎全部。对于任何问题,请问! 编辑:这里和那里的东西