0

我有一个Product实体和表,并且希望数据库设计允许通过其名称顶部的不同关键字查找产品,也就是说,就像使用同义词库一样,例如产品名称“HDR-TD20V”也应该通过关键字“摄像机”找到, "camera", "video camera" 等。请注意,同样的机制可用于从不同的输入语言中定位相同的记录,例如寻找“camara de video”(西班牙语)或“videokamera”(德语)也应该找到相同的记录。

假设我使用的是 Hibernate-search 即 Lucene,我有以下两种设计选择:

  1. 非规范化方法Product表有一个keywords包含该产品的逗号分隔关键字的列。这显然违反了第一范式“......每个属性的值仅包含来自该域的单个值。”。但是,这将与 Hibernate-search 很好地集成。
  2. 规范化方法:定义一个Keyword实体表Keyword(id,keyword,languageId),即多对多关联ProductKeyword(productId,keywordId),但与 Hibernate-Search 的集成不再那么直观......除非我创建一个物化视图,即select * from Product p, Keyword k, ProductKeyword pk where p.id=pk.productId and k.id=pk.keywordId并索引这个物化视图。

我当然更喜欢选择 2,但我不确定 Hibernate-search 如何以最佳方式覆盖这个用例。

4

1 回答 1

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 映射的确切外观取决于用户案例

于 2013-02-07T12:03:38.477 回答