Reviews表外键设计问题:实现用户间评论功能的解决方案咨询
这是个很典型的用户评论关联场景,我给你梳理几个适配你系统限制的可行方案:
方案1:添加不同命名的目标用户外键字段
既然系统只是禁止你新增同名的UserId字段,那换个清晰的字段名就能解决问题——比如新增ReviewedUserId或者TargetUserId字段,既不会和现有评论者的UserId冲突,又能建立和USERS表的外键关联。
具体操作思路:
- 在
REVIEWS表中新增ReviewedUserId字段,字段类型和USERS表的主键保持一致 - 给这个字段添加外键约束,关联到
USERS表的主键 - 这样每条评论就同时绑定了「评论发起者(原
UserId)」和「被评论目标用户(ReviewedUserId)」,完全满足你的业务需求
这个方案最直接高效,只要系统不是完全禁止添加任何新字段,只是限制重复字段名,这就是最优解。
方案2:创建中间关联表(完全无法新增字段时的备选)
如果系统严格到连任何新字段都不能加,那可以新建一个中间关联表,比如ReviewTargetMapping,用来存储评论和目标用户的对应关系:
示例表结构(SQL):
CREATE TABLE ReviewTargetMapping ( ReviewId INT FOREIGN KEY REFERENCES REVIEWS(ReviewId), TargetUserId INT FOREIGN KEY REFERENCES USERS(UserId), PRIMARY KEY (ReviewId, TargetUserId) -- 确保一条评论仅对应一个目标用户(适配你的单用户评论场景) );
使用这个方案需要注意:
- 查询时需要多一次表关联操作,比如获取某用户收到的所有评论,要关联
REVIEWS和ReviewTargetMapping - 要保证数据一致性,比如删除评论时同步删除中间表的对应记录,可以通过触发器或者业务逻辑层的代码来实现
不推荐的临时方案
如果你的REVIEWS表有闲置的通用字段(比如Metadata、ExtraInfo这类存冗余信息的字段),理论上可以把目标用户ID存在这里,但非常不建议这么做——这会破坏数据结构的规范性,后续维护和排查问题都会变得非常麻烦,优先考虑前面两个方案。
内容的提问来源于stack exchange,提问作者Nash
相关产品推荐
相关产品推荐

