簡體   English   中英

如何在Java中實現n:m關系?

[英]How to implement n:m relation in Java?

我需要在Java中實現n:m關系。 用例是目錄。

  • 產品可以分為多個類別
  • 一個類別可以容納多個產品

我目前的解決方案是擁有一個具有兩個哈希映射的映射類。

  • 第一個hashmap的關鍵是產品ID,值是類別ID列表
  • 第二個hashmap的關鍵是類別id,值是產品ID列表

這完全是多余的,我需要一個設置類,始終注意在兩個哈希映射中存儲/刪除數據。

但這是我發現在O(1)中創造以下表現的唯一方法:

  • 什么產品屬於哪一類?
  • 什么類別的產品?

我想在各方面避免全陣列掃描或類似的事情。

但是必須有另一個更優雅的解決方案,我不需要將數據索引兩次。

請點亮我。 我只有普通的Java,沒有數據庫或SQLite或者可用的東西。 如果可能的話,我也不想真正實現btree結構。

如果您通過成員集合將類別與產品相關聯,反之亦然,那么您可以完成同樣的事情:

public class Product {
     private Set<Category> categories = new HashSet<Category>();
     //implement hashCode and equals, potentially by id for extra performance
}

public class Category {
     private Set<Product> contents = new HashSet<Product>();
     //implement hashCode and equals, potentially by id for extra performance
}

唯一困難的部分是填充這樣的結構,可能需要一些中間地圖。

但是使用輔助hashmaps / trees進行索引的方法並不錯。 畢竟,放在數據庫上的大多數索引都是輔助數據結構:它們與行表共存; 行不一定按索引本身的結構組織。

使用這樣的外部結構可以使您保持優化和數據彼此分離; 這不是一件壞事。 特別是如果明天你想為給定供應商的產品添加O(1)查找,例如

編輯:順便說一句,它看起來像你想要的是一個優化的 Multimap的實現,以在O(1)中進行反向查找。 我不認為Guava有什么可做的,但你可以實現Multimap接口,所以至少你不必單獨處理維護HashMaps。 實際上它更像是一個BiMap,它也是一個Multimap,鑒於它們的定義是矛盾的。 我同意MStodd的說法,你可能想要將自己的抽象層用於封裝兩個地圖。

你的解決方案非常好。 請記住,將對象放入HashMap不會復制Object,它只是存儲對它的引用,因此時間和內存的成本非常小。

我會選擇你的第一個解決方案。 在兩個哈希映射周圍有一層抽象。 如果您擔心並發,請為CRUD實施適當的鎖定。

如果您能夠使用不可變數據結構,Guava的ImmutableMultimap提供了一個inverse()方法,使您可以按值獲取密鑰集合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM