我有一个Product
实体和表格,并希望数据库设计允许在其名称之上通过不同的关键字查找产品,即使用同义词库,例如产品名称“HDR-TD20V”也应该通过关键词“camcorder”,“camera”,“video camera”等找到。注意,这些相同的机制可用于从不同的输入语言中找到相同的记录,例如寻找“camara de video”(西班牙语)或“videokamera”(德语)也应该找到相同的记录。
假设我正在使用Hibernate搜索,即Lucene我有以下两种设计选择:
Product
表格的keywords
列包含该产品的逗号分隔关键字。这显然违反了First Normal Form“......每个属性的值只包含该域中的一个值。”但是,这将很好地与Hibernate-search集成。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如何最佳地覆盖这个用例。
答案 0 :(得分: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映射的确切外观取决于用户案例