0

データベースを分割し、各ユーザーのデータを特定のサーバーに保存しています。

私のユースケースはかなり単純です:

  • ユーザーは会話をしています。
  • 1つの会話に対して、データベースには2つの代表レコードがあります(各ユーザーには独自の会話レコードがあります)。

ユーザーの削除操作の場合、各ユーザー間の会話をすべて削除したいと思います。つまり、各サーバーのユーザーに関連するすべての会話を削除する必要があります。サーバーごとにグループ化されたデータがどうしても必要です。

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

最初は、各行がサーバーと列のユーザーを表すことができると思いました。この場合、テーブルのデータ構造は適切ではないようです。この場合、テーブルが表しているのはスパースデータです。表はM x Nデータを表すことができますが、私はデータだけを持っていM + Nます。

このデータを表すための正しいデータ構造は何ですか?

編集:

もちろん、Tableはこの状況を処理できますが、この問題に適しているかどうかはわかりません。Tableについて考えさせられるのは、複雑なアルゴリズムを意味する行メソッドと列メソッドがあることです。私のユースケースでは、列には1つの値があります。つまり、各ユーザーには対応するサーバーが1つだけありますが、各行には複数の値があり、各サーバーには複数のユーザーがいます。

4

1 に答える 1

3

あなたのユースケースでは、既存のデータ構造を使用することはうまくいかないと思います。

代わりに、データに対応するオブジェクトを設計する必要があります。

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

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

(Getters, Setters, equals() / hashCode() はいずれも省略)

ここで、ユーザーと会話を検索する 2 つのマップを保持します。

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

などgetOrCreateConversation(Integer id)のメソッドを記述します。getOrCreateUser(Integer id)

また、JPA や Hibernate などの永続化テクノロジの使用を検討する必要があります。これらは、このような関係を維持するのに優れているからです。

于 2012-12-12T09:50:53.863 に答える