2017-12-12 4 views
0

私はアプリケーションの知識システムを設計したいと思っています。私はユーザーエンティティを持っています。私はユーザーに友人のリストを持ってほしい。これを行うには2つの方法があります。ユーザーがリストを持っている...実体の親密度システムを設計する

最初の方法

@ManyToMany 
@JoinTable(
     name = "user_friends", 
     joinColumns = {@JoinColumn(name = "to_user_id")}, 
     inverseJoinColumns = {@JoinColumn(name = "from_user_id")} 
) 
private Set<FriendshipEntity> friends; 

FriendshipEntity

@Entity 
@Table(name = "users_friends") 
public class FriendshipEntity { 

    @Id 
    @Basic(optional = false) 
    @Column(unique = true, nullable = false, updatable = false) 
    @GeneratedValue 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name = "from_user_id", nullable = false) 
    private UserEntity fromUser; 

    @ManyToOne 
    @JoinColumn(name = "to_user_id", nullable = false) 
    private UserEntity toUser; 
} 

私はこのよう

fromUser.getFriends().add(new FriendshipEntity(fromUser, toUser)); 
toUser.getFriends().add(new FriendshipEntity(toUser, fromUser)); 

ための第二の方法で友情を作成しますID自体。

@ElementCollection 
@CollectionTable(
     name = "users_friends", 
     joinColumns = @JoinColumn(name = "user_id", nullable = false, updatable = false) 
) 
private Set<Long> friends; 

作成友情

fromUser.getFriends().add(toUser.getId()); 
toUser.getFriends().add(fromUser.getId()); 

友情システムを作成することが最良のあなたの意見では方法です

?別のアイデアがあるかもしれませんか?

+0

私の他のアイデアは、DBAにはあまり人気がありませんが、友人のList メンバーフィールドを持つ通常のPOJOオブジェクトとしてUserを構成し、それをデータベースのBLOBにシリアル化します。 – markspace

+0

最初のデザインは無効です。 FriendshipにManyToOne with Userがある場合、双方向結合のもう一方の側はManyToManyではなくOneToManyでなければなりません。そしてそれはmappedBy属性でマークされた反対側でなければなりません。 –

答えて

0

データストアを選択する高級感がある場合は、代わりにグラフデータベースを使用することをおすすめします。グラフデータベースは、SQLデータベースよりも、関係を重視するシステムであるこのユースケースに適しています。グラフデータベースを使用すると、SQLデータベースよりもはるかに洗練された効率的な複雑なクエリを作成できます。友人グラフの例については、Neo4jのthis linkを参照してください。

最初のアプローチは、別の注釈を使用してSpring Data Neo4jで実装する方法とまったく同じです。

関連する問題