Database 表间双向外键的数据库设计考虑

Database 表间双向外键的数据库设计考虑,database,hibernate,jpa,Database,Hibernate,Jpa,我有两个类,User和Status,虽然一个用户将有许多状态,但这自然是多对一关系,可以很容易地映射到DB表 但是,该需求还需要用户保持其“当前”状态,即在用户表中,它需要有一个指向状态表的外键。这样做的结果是在两个表之间的相反方向上有两个外键 其中一个明显的问题是,一旦将记录插入到两个表中,我就不能删除它们,因为从一个表中删除将违反另一个表的外键 对于这种情况,什么是最佳设计?是否必须将状态保存在单独的表中?它不能仅仅由一个java枚举表示,用户将拥有一个status属性。大概是这样的: pu

我有两个类,
User
Status
,虽然一个用户将有许多状态,但这自然是
多对一
关系,可以很容易地映射到DB表

但是,该需求还需要用户保持其“当前”状态,即在
用户
表中,它需要有一个指向
状态
表的外键。这样做的结果是在两个表之间的相反方向上有两个外键

其中一个明显的问题是,一旦将记录插入到两个表中,我就不能删除它们,因为从一个表中删除将违反另一个表的外键


对于这种情况,什么是最佳设计?

是否必须将状态保存在单独的表中?它不能仅仅由一个java枚举表示,用户将拥有一个status属性。大概是这样的:

public enum UserStatus {
        X, Y, Z;
}

public class User {
    private UserStatus status;
        ...
}
  • 在状态表中,添加一列以确定此状态记录是否为“当前”。 **对于性能问题,您只能将“当前”状态记录设置为“1”值,其余状态记录设置为空值
  • 您现在不必使用2个外键,只需使用一个-从状态到用户
  • 如果您使用hibernate作为post的标记:),则可以在数据库中创建一个视图,该视图将仅选择“当前”状态记录,并且具有与状态表相同的结构
  • 使用一对一关系将视图连接到用户实体

  • 我希望这对你有帮助

    这就是我目前使用的方法。了解hibernate中视图的用法很有趣,谢谢。@Wudong数据库视图的用法与表的用法相同,使用
    @table
    注释