すべてのタグを異なるレコード(正規化)に含めると、必要に応じてタグの名前を簡単に変更し、タグ名の履歴を追跡できるようになります。
SO
たとえば、名前をSQL Server
に変更しました 関連するタグが少なくとも3回(mssql
-> sqlserver
-> sql-server
。
1つのレコードにすべてのタグがある(非正規化)ということは、この列にFULLTEXT
でインデックスを付けることができることを意味します 一度に2つ以上のタグを持つ投稿にインデックスを付けて検索します:
SELECT *
FROM posts
WHERE MATCH(tags) AGAINST('+mma +ufc')
これも可能ですが、正規化された設計では効率が低下します。
(@ft_min_word_len
を調整することを忘れないでください 3
のタグにインデックスを付ける これが機能するための文字以下)
両方のデザインを組み合わせることができます。マップテーブルと非正規化列の両方を保存します。ただし、これにはさらにメンテナンスが必要になります。
正規化されたデザインをデータベースに保存し、指定したクエリを使用してタグをSphinx
にフィードすることもできます。 またはLucene
。
このようにして、MySQL
を使用して履歴を掘り下げることができます 、Sphinx
を使用したフルテキストタグ検索 、追加のメンテナンスは必要ありません。