如何设计一个与自身有多对多关系的表?

时间:2012-07-13 03:23:41

标签: database hibernate jpa orm

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

  1. friends属性是一个字符串,其中所有用户名都被“,”拆分,这样很难阅读和修改。
  2. 朋友属性是一个像Set<Users>这样的集合,但是这样我不知道怎么写实体?
  3. 任何人都知道最佳做法吗?

2 个答案:

答案 0 :(得分:2)

Hay涵盖了Enterprise Model Patterns。

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

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);

答案 1 :(得分: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创建一个表,并为User s之间的关系创建一个连接表。 User表格有2列,'id'和'name'。 user_friend表将包含2列,'user_id'和'friend_id'。 user_friend中的列都是User表的外键。