【问题标题】: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