【问题标题】:Building a table of "Likes for feedbacks", SQL建立一个“喜欢反馈”的表,SQL
【发布时间】:2022-11-19 08:28:49
【问题描述】:

我正在构建一个与我的反馈功能相关的新表。 我的后端使用 Java、spring boot 构建,我使用的是 hibernate。问题是插入ID列还是WITHOUT? 因为我有一个 ID 并且 hibernate 知道他在看什么..

CREATE TABLE feedback_helpful (
user_id BIGINT NOT NULL,
comment_id BIGINT NOT NULL,
timestamp TIMESTAMP DEFAULT NOW(),
FOREIGN KEY(user_id) REFERENCES users(id),
FOREIGN KEY(comment_id) REFERENCES feedback_comment_public(id),
PRIMARY KEY(user_id, comment_id)
);

问题是会不会影响速度?来自数据库的绑定模型会更快吗?构建它的最佳方法是什么?

谢谢

标签: java mysql sql spring-boot hibernate


【解决方案1】:

案例 1:许多用户对许多 cmet 进行投票——典型的“多对多”关系。有一种最好的方法

-- no id
PRIMARY KEY(comment_id, user_who_upvoted)
INDEX(user_who_upvoted, comment_id)

一个指标,一个方向高效;另一个负责另一个方向。

案例2:(这是“user_id”写“评论”的地方。)

既然你有一个“自然”的PRIMARY KEY(user_id, comment_id),就没有必要添加一个人工ID。

虽然这看起来像一个“多对多”的映射表,但我认为它不是。我希望一个“用户”可以拥有多个“cmets”。但是一个“评论”可以有很多“用户”吗?

如果不是,那就真的是“一对多”的关系了。这样的关系应该不是用一个额外的表来实现。反而

  • users没有提到评论

  • comments——每一行都有它相关的user_id

  • comments 可能需要 PRIMARY KEY(comment_id), INDEX(user_id)

  • comment_id is AUTO_INCREMENT` 并且可能仅用于为该表提供唯一键。 (不太可能有“自然”PK。)

  • 如果您经常为一个用户获取所有 cmet,那么这比上面的索引建议稍微好一点:

    PRIMARY KEY(user_id, comment_id),  -- for efficient access
    INDEX(comment_id)  -- to keep auto_increment happy
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多