gpt4 book ai didi

java - Guava 餐 table 替代品

转载 作者:行者123 更新时间:2023-12-02 00:06:10 27 4
gpt4 key购买 nike

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

我的用例相当简单:

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

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

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 具有行和列方法,这意味着复杂的算法。在我的用例中,列有一个值,这意味着每个用户只有一个对应的服务器,但每一行有多个值意味着每个服务器有多个用户。

最佳答案

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

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

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

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

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

现在保留两个 map 来查找用户和对话:

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

编写诸如 getOrCreateConversation(Integer id)getOrCreateUser(Integer id) 等方法

此外,您应该考虑使用 JPA 或 Hibernate 等持久性技术,因为它们非常适合维护此类关系。

关于java - Guava 餐 table 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13835685/

27 4 0