0

我们有分区数据库,每个用户的数据都存储在特定的服务器上。

我的用例相当简单:

  • 用户有对话。
  • 对于一个对话,数据库中有两个代表记录(每个用户都有自己的对话记录)。

如果对用户进行删除操作,我想删除每个用户之间的所有对话。也就是说,我需要删除每个服务器中与用户相关的所有对话。我迫切需要每台服务器的分组数据。

Table<Integer, Integer, Set<Integer>> setPerUser = HashBasedTable.create();

for(Conversation conversation : conversations) {
   Integer serverIndex = getServerForUser(conversation);
   Integer userId = conversation.getUserId();
   Set<Integer> uci = setPerUser.get(serverIndex, userId);
   if(uci == null) {
      uci = Sets.newHashSet();
      setPerUser.put(serverIndex, userId, uci);
   }
   uci.add(conversation.id);
}

一开始我以为每一行都可以代表服务器和列用户。似乎 Table 数据结构不适合这种情况。在这种情况下,表表示的是太稀疏的数据。虽然 Table 可以表示M x N数据,但我只有M + N数据。

表示这些数据的正确数据结构是什么?

编辑:

当然 Table 可以处理这种情况,但我不确定它是否适合这个问题。让我想到 Table 的是具有行和列方法,这意味着复杂的算法。在我的用例中,列有一个值,这意味着每个用户只有一个对应的服务器,但每一行有多个值意味着每个服务器有多个用户。

4

1 回答 1

3

我认为使用现有的数据结构不适用于您的用例。

相反,您应该设计与您的数据相对应的对象:

public Class User{
  int id;
  Set<Conversation> conversations;
}

public class Conversation{
  int id;
  Set<User> parcipitants;
}

(Getters, Setters, equals() / hashCode() 在这两种情况下都省略了)

现在保留两张地图来查找用户和对话:

private Map<Integer, Conversation> conversationsById;
private Map<Integer, User> usersById;

写方法之类getOrCreateConversation(Integer id)getOrCreateUser(Integer id)

此外,您应该考虑使用 JPA 或 Hibernate 之类的持久性技术,因为它们在维护此类关系方面非常出色。

于 2012-12-12T09:50:53.863 回答