我有2张桌子:
Users (id, name, lastname)
Friends (id1, id2)
给定这两个表,我需要能够找到2个用户d(id1,id2)之间的距离
我定义了一个User类,该类保存表中的每个user属性。
我需要建立一个图形。我的图表数据结构是
Map<User, Set<User>>
将用户映射到他的一组朋友。
如何建立图表?我向数据库查询数据库中所有用户的ID。我有一个
int[] userids
然后对于此数组中的每个int:
(1)我建立一个User对象,在db中获取该用户的属性
(2)我查询数据库中的Friends表,以获取该用户的朋友的ID:
int [] friends
(3)对于这个friends数组中的每个int,我构建一个User对象,在db中获取该用户的属性并将其添加到
Set<User> friends = new Set<User>();
问题1:有什么想法可以更好地做到这一点?假设我有500个用户,并且在Friends表中有20000个条目,这将永远花费...
这里最大的问题是,当2个用户在数据库中为“相同”用户时,它们在我的图形的differents对象中被引用!
这弄乱了我的距离算法。我从一个用户u开始,得到他的Friends {f1,f2},当我想使用graph.get(f1)和graph.get(f2)成为朋友时,我得到null(由于我的问题中所述的原因) ,即在许多不同的User对象中有1个db用户)
我需要找到一种构建图的方法,以便在一个堆中仅引用一个给定的用户说(1,John,Doe)(仅一个User对象)。
问题2:如何?
非常感谢
Help with Java Graph Implementation
最佳答案
一次读取一个用户将很慢,这是数据库的许多往返。如果Friends
表上没有索引,它将特别慢。
您最好只是从数据库中获取所有数据,然后自己用Java构建图形。
select UserId, ... from Users;
就像您现在所做的那样,为每个用户构建一个
User
。您将要创建一个从Map
到userId
的User
,以在第2步中使用(因此,对于同一User
,您不会获得多个userId
对象)。select id1, id2 from Friends;
然后在上面的
Map
中查找两个ID,然后将每个User
添加到另一个User
的出站边缘集中。关于java - 数据库中Java图形的实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10249830/