我有一个Product
实体和表,并且希望数据库设计允许通过其名称顶部的不同关键字查找产品,也就是说,就像使用同义词库一样,例如产品名称“HDR-TD20V”也应该通过关键字“摄像机”找到, "camera", "video camera" 等。请注意,同样的机制可用于从不同的输入语言中定位相同的记录,例如寻找“camara de video”(西班牙语)或“videokamera”(德语)也应该找到相同的记录。
假设我使用的是 Hibernate-search 即 Lucene,我有以下两种设计选择:
- 非规范化方法:
Product
表有一个keywords
包含该产品的逗号分隔关键字的列。这显然违反了第一范式“......每个属性的值仅包含来自该域的单个值。”。但是,这将与 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 如何以最佳方式覆盖这个用例。