2013-02-04 94 views
0

我有一個Product實體和表,並希望數據庫設計允許通過名稱頂部的不同關鍵字查找產品,也就是說,就像使用同義詞詞典例如產品名稱「HDR-TD20V」也應該通過關鍵詞「攝像機」,「攝像機」,「攝像機」等來找到。注意,可以使用相同的機制來定位來自不同輸入語言的相同記錄,例如,尋找「camara de video」(西班牙語)或「videokamera」(德語)也應該找到相同的記錄。如何在這種情況下最好地應用Hibernate-Search?

假設我使用Hibernate搜索即Lucene的我有以下兩種設計選擇:

  1. 德規範化方法Product表中有一個keywords列包含逗號分隔的關鍵字該產品。這顯然違反了First Normal Form「...每個屬性的值只包含來自該域的單個值。」但是,這將與Hibernate-search很好地集成。
  2. 規範化方法:定義一個Keyword實體表即Keyword(id,keyword,languageId)和許多-to-many關聯ProductKeyword(productId,keywordId)但與Hibernate,搜索的整合不是那麼直觀了......除非例如我創建了一個物化視圖,即select * from Product p, Keyword k, ProductKeyword pk where p.id=pk.productId and k.id=pk.keywordId並索引這個物化視圖。

我當然更喜歡選擇2,但我不確定Hibernate搜索如何最優地覆蓋這個用例。

+1

你確定它的產品關鍵字和不是產品類別關鍵字? –

+0

我相信,我使用的可能是一個糟糕的例子,因爲攝像機確實是一個類別。我將分別支持(分層)類別。這是完全不同的方面。但是,謝謝。 –

+0

請參閱http://stackoverflow.com/questions/316780/schema-for-a-multilanguage-database和http://stackoverflow.com/questions/929410/what-are-best-practices-for-multi-language-數據庫設計 –

回答

1

像這樣的東西應該工作:

@Indexed 
public class Product { 
    @Id 
    private long id; 

    @ManyToMany 
    @IndexedEmbedded 
    Set<Keyword> keywords; 

    // ... 
} 

public class Keyword { 

    @Id 
    private long id; 

    // only needed if you want a bidirectional relation 
    @ManyToMany 
    @ContainedIn 
    Set<Product> products; 

    // ... 
} 

我離開了懶加載選項的JPA映射等究竟如何看起來像依賴於用戶的情況下

+0

謝謝! IndexedEmbedded確實是我所尋找的答案。因此,選擇#2完全符合Hibernate-Search。 –