データベースを分割し、各ユーザーのデータを特定のサーバーに保存しています。
私のユースケースはかなり単純です:
- ユーザーは会話をしています。
- 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つだけありますが、各行には複数の値があり、各サーバーには複数のユーザーがいます。