【问题标题】:How to design a table which have many-to-many relationship with itself?如何设计一个与自身具有多对多关系的表?
【发布时间】:2012-07-12 21:41:28
【问题描述】:

例如,一个Users实体有一个friends属性,我该如何设计这个friends属性,在我看来有2种方式:

  1. friends 属性是一个字符串,所有用户名都用“,”分隔,这样很难阅读和修改。
  2. friends属性是一个像Set<Users>这样的Set,但是这样我不知道实体怎么写?

谁知道最好的做法?

【问题讨论】:

    标签: database hibernate jpa orm


    【解决方案1】:

    如果User 可以有多个朋友,您可以像这样注释您的User 实体:

    @Entity
    public class User
    {
        @Id
        private Long id;
        private String name;
        @ManyToMany
        @JoinTable(
                name = "user_friends",
                joinColumns =
                { @JoinColumn(
                        name = "user_id") },
                inverseJoinColumns =
                { @JoinColumn(
                        name = "friend_id") })
        private Set<User> friends;
    }
    

    这样,将为User 创建一个表,并为Users 之间的关系创建一个连接表。 User 表将有 2 列,“id”和“name”。 user_friend 表将有 2 列,“user_id”和“friend_id”。 user_friend 中的列都是User 表的外键。

    【讨论】:

    • 我尝试并使用了与您相同的 JPA 注释,它有效。谢谢你。您认为以后会导致这种自我关系的任何其他问题吗?
    • 我假设友谊必须对两个用户可见,因此您必须设置友谊的另一端。除了循环依赖之外,我看不到任何未来的问题。 ;-)
    【解决方案2】:

    这是由 Hay 介绍的企业模型模式。

    一方代表一个人(或一个组织):

    Party
    id
    name
    

    一方可以在一段时间内与另一方建立关系:

    PartyRelationship
    fromPartyId
    toPartyId
    fromDate
    toDate nullable
    

    基本图:

    Party -< PartyRelationship >- Party
    

    示例 SQL:

    insert into party values (1, 'Jerry');
    insert into party values (2, 'Neil');
    
    insert into partyRelationship values (1, 2, getDate(), null);
    

    【讨论】:

    • 哇,他们的友谊永远不会结束!
    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 2023-03-10
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多