エンティティとテーブルがProduct
あり、その名前の上に異なるキーワードで製品を検索できるデータベース設計が必要です。つまり、シソーラスを使用するように、製品名「HDR-TD20V」はキーワード「camcorder」でも検索する必要があります。 、「camera」、「video camera」など。これと同じメカニズムを使用して、異なる入力言語から同じレコードを見つけることができることに注意してください。たとえば、「camara de video」(スペイン語) または「videokamera」(ドイツ語) を検索すると、同じレコードが検索されます。同じレコード。
Hibernate-search 、つまり Lucene を使用していると仮定すると、次の 2 つの設計上の選択肢があります。
- 非正規化アプローチ:
Product
テーブルには、keywords
その製品のカンマ区切りのキーワードを含む列があります。これは明らかに第 1 正規形に違反しています。ただし、これは 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 がこのユースケースをどのように最適にカバーするかはわかりません。