すべてのタグを異なるレコード(正規化)に含めると、必要に応じてタグの名前を簡単に変更し、タグ名の履歴を追跡できるようになります。
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を使用したフルテキストタグ検索 、追加のメンテナンスは必要ありません。