繁体   English   中英

如何针对我的特定情况有效地设计 MySQL 数据库

[英]How to efficiently design MySQL database for my particular case

我正在用 PHP MySQL 开发一个论坛。 我想让我的论坛尽可能高效。

我做了这两张表

  1. tbl_threads
  2. tbl_comments

现在,问题是每个评论下都有一个喜欢和不喜欢的按钮。 我必须存储使用comment_id单击“喜欢”或“不喜欢”按钮的user_name 我在user_dislikestbl_comments了一个 user_likes 列和一个user_dislikes列来存储逗号分隔的 user_names。 但是在这个论坛上,我读到这不是一种有效的方式。 有人建议我创建第三个表来存储喜欢和不喜欢,并使我的数据库设计符合 1NF。

但问题是,如果我制作第三个表tbl_user_opinion并制作两个这样的字段 1.comment_id 2.type(喜欢或不喜欢)

因此,我是否必须运行与页面上的评论一样多的 sql 查询,才能获取每个评论的喜欢和不喜欢数据。 会不会效率低下。 我认为我在这里有些困惑。 有人可以澄清这一点。

你有一个这样的关系方案:

有两种方法可以解决这个问题。 第一个,“干净”的是建立你的“喜欢”表,并在适当的列上做“计数(*)”。

第二个是在每个评论中存储一个计数器,指示有多少向上和向下。 如果您想检查,如果特定用户对评论进行了投票,您只需要检查一个条目,您可以轻松地将其作为自己的查询处理并将它们合并到您的数据库之外的两个(为此使用查询导致 comment_id 和用户在特定线程中所做的投票。)

您使用逗号分隔列表的方法性能不佳,因为如果没有更高的智能或大量解析字符串,您就无法解析它。 如果您有数据库 - 使用它!

(“一个信息 - 一个数据集”!)

逗号分隔的列表违反了原子性原则,因此违反了 1NF。 您将很难保持参照完整性,并且在大多数情况下也很难进行查询。

这是一种以规范化方式执行此操作的方法:

在此处输入图片说明

这是非常集群友好的:它将属于同一评论的赞成票在物理上靠近在一起(反对票同上),使以下查询相当有效:

SELECT
    COMMENT.COMMENT_ID,
    <other COMMENT fields>,
    COUNT(DISTINCT UP_VOTE.USER_ID) - COUNT(DISTINCT DOWN_VOTE.USER_ID) SCORE
FROM COMMENT
    LEFT JOIN UP_VOTE
        ON COMMENT.COMMENT_ID = UP_VOTE.COMMENT_ID
    LEFT JOIN DOWN_VOTE
        ON COMMENT.COMMENT_ID = DOWN_VOTE.COMMENT_ID
WHERE
    COMMENT.COMMENT_ID = <whatever>
GROUP BY
    COMMENT.COMMENT_ID,
    <other COMMENT fields>;

[SQL 小提琴]

如果这对您来说足够快,请衡量实际的数据量。 如果不是,则对模型进行反规范化并将总分缓存在 COMMENT 表中,并在每次向 *_VOTE 表中插入或删除新行时通过触发器保持它的最新状态。

如果您还需要获取特定用户投票的评论,您将需要 *_VOTE {USER_ID, COMMENT_ID} 上的索引,即上面的主/集群键的反向索引。 1


1这就是为什么我没有只使用一个包含附加字段的 VOTE 表的原因之一,该字段可以是 1(赞成票)或 -1(反对票):用二级覆盖效率较低索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM