分类表新增菜单外键实现名称唯一是否会导致关联表冗余?
问题1:你提出的方案是否可行?
可行,完全匹配你的业务需求。
你需要实现「同一菜单下分类名称唯一」的约束,在categories表新增menu_id外键后,添加UNIQUE(name, menu_id)的联合唯一约束,刚好可以在数据库层面强制保证这个规则,从根上避免出现脏数据。
问题2:是否和menu_category_members表作用重复?
是,该表会完全冗余,可以直接删除。
原因解释:
你当前的业务模型本质是菜单和分类为一对多关系:一个菜单下有多个分类,每个分类仅属于一个菜单(从你给出的测试数据也能看出来,同名的Category1在MenuA和MenuB下是两条完全独立的分类记录,不需要跨菜单复用)。
你最初设计的menu_category_members是多对多关系的关联表,只有当「同一个分类可以挂到多个菜单下」的场景才需要使用。如果没有跨菜单复用分类的需求,这个表完全没必要存在,直接通过categories.menu_id就可以关联查询对应菜单的所有分类。
补充选型参考
- 如果确定分类不需要跨菜单复用:直接用你修改后的
categories表方案,删除多对多关联表即可,这是这类场景的标准惯用实现。 - 如果后续需要支持分类跨菜单复用:那你的方案就不适用了,此时需要保留多对多关联表,要实现同一菜单下名称唯一的话,需要把
category_name字段冗余到menu_category_members表加联合唯一约束,或者在业务层做校验。
内容的提问来源于stack exchange,提问作者spxcxlxxs
相关产品推荐
相关产品推荐

