2012-12-12 123 views
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可以代表M x N的數據,但我只有M + N的數據。

什麼是正確的數據結構來表示這些數據?

編輯:

當然表可以處理這種情況,但我不知道它是否是恰當與否這個問題。讓我考慮一下Table的問題是有行列方法,這意味着一個複雜的算法。在我的用例中,列有一個值,這意味着每個用戶只有一個對應的服務器,但每行有多個值意味着每個服務器都有多個用戶。

+0

你爲什麼認爲'Table'無法處理它?有多種實現方式,例如'HashBasedTable'適用於稀疏表。有一些開銷,你可以通過手工執行來消除,但它值得嗎? – maaartinus

+0

@maaartinus編輯。你能擴大消除手工製造費用嗎?它真的會幫助我。謝謝 – Cemo

+1

看看肖恩帕特里克弗洛伊德的答案,這是關於我會做什麼。但是,我不明白你爲什麼要在你的數據結構中使用服務器? – maaartinus

回答

2

我認爲使用現有的數據結構不適合您的用例。

相反,你應該設計對象相對應的數據:

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

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

(吸氣劑,二傳手,equals()方法在這兩種情況下ommitted/hashCode()方法)

現在保持兩個地圖查找用戶和對話:

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

寫入方法,如getOrCreateConversation(Integer id)getOrCreateUser(Integer id)

另外,您應該考慮使用像JPA或Hibernate這樣的持久性技術,因爲這些技術非常適合維護這種關係。