私のウェブサイトに、stackoverflowで使用するのと同じようにタグ付けシステムを実装しています。私の質問は、タグを保存して検索およびフィルタリングできるようにする最も効果的な方法は何ですか?
私の考えはこれです:
Table: Items
Columns: Item_ID, Title, Content
Table: Tags
Columns: Title, Item_ID
これは遅すぎるのですか?もっと良い方法はありますか?
私のウェブサイトに、stackoverflowで使用するのと同じようにタグ付けシステムを実装しています。私の質問は、タグを保存して検索およびフィルタリングできるようにする最も効果的な方法は何ですか?
私の考えはこれです:
Table: Items
Columns: Item_ID, Title, Content
Table: Tags
Columns: Title, Item_ID
これは遅すぎるのですか?もっと良い方法はありますか?
回答:
1つのアイテムに多くのタグが付けられます。そして、1つのタグは多くのアイテムに属します。これは、多対多の障害を克服するために、おそらく中間テーブルが必要になることを意味します。
何かのようなもの:
テーブル:アイテム
列:Item_ID、Item_Title、Contentテーブル:タグ
列:Tag_ID、Tag_Titleテーブル:Items_Tags
列:Item_ID、Tag_ID
あなたのウェブアプリはめちゃくちゃ人気があり、道を非正規化する必要があるかもしれませんが、あまりにも早く水を濁らせても意味がありません。
データベーススキーマのタグ付けに関するPhilipp Kellerのブログ投稿を読んでください。彼は両方で、いくつかをしようと彼の結果を報告する一般的なクエリの構築の容易さの観点から、およびパフォーマンスの面で。タグの数、タグ付けされたアイテムの数、およびアイテムごとのタグの数がすべて要因でした。投稿は2005年からです。それ以降の更新については知りません。
実際、規模によっては、タグテーブルを非正規化する方が良い方法かもしれません。
このように、タグテーブルは単にtagid、itemid、tagnameを持っています。
タグ名は重複しますが、特定のアイテムのタグの追加/削除/編集がはるかに簡単になります。新しいタグを作成する必要はなく、古いタグの割り当てを削除して新しいタグを再割り当てするだけです。タグ名を編集するだけです。
タグのリストを表示するには、単純にDISTINCTまたはGROUP BYを使用します。もちろん、タグの使用回数も簡単にカウントできます。
少し標準的でないものを使用してもかまわない場合、Postgresバージョン9.4以降には、タイプJSONテキスト配列のレコードを保存するオプションがあります。
あなたのスキーマは次のようになります:
Table: Items
Columns: Item_ID:int, Title:text, Content:text
Table: Tags
Columns: Item_ID:int, Tag_Title:text[]
詳細情報については、ジョシュBerkus氏によって、この優れた記事を参照してください。 http://www.databasesoup.com/2015/01/tag-all-things.html
パフォーマンスに関して徹底的に比較されたより多くのさまざまなオプションがあり、上記で提案されたものは全体的に最高です。
タグとアイテムの関連付けには、中間の3番目のテーブルを使用することをお勧めします。これは、タグとアイテムの間に多対多の関係があるためです。つまり、1つのアイテムを複数のタグに関連付け、1つのタグを複数のアイテムに関連付けることができます。HTH、バルブ。
アイテムには「ID」フィールドが必要で、タグには「ID」フィールドが必要です(主キー、クラスター化)。
次に、ItemID / TagIDの中間テーブルを作成し、そこに「Perfect Index」を配置します。