タグをデータベースに保存する最も効率的な方法は何ですか?


138

私のウェブサイトに、stackoverflowで使用するのと同じようにタグ付けシステムを実装しています。私の質問は、タグを保存して検索およびフィルタリングできるようにする最も効果的な方法は何ですか?

私の考えはこれです:

Table: Items
Columns: Item_ID, Title, Content

Table: Tags
Columns: Title, Item_ID

これは遅すぎるのですか?もっと良い方法はありますか?



1
2016年現在、SolrまたはElasticsearchを使用
Charles L.

回答:


190

1つのアイテムに多くのタグが付けられます。そして、1つのタグは多くのアイテムに属します。これは、多対多の障害を克服するために、おそらく中間テーブルが必要になることを意味します。

何かのようなもの:

テーブル:アイテム
列:Item_ID、Item_Title、Content

テーブル:タグ
列:Tag_ID、Tag_Title

テーブル:Items_Tags
列:Item_ID、Tag_ID

あなたのウェブアプリはめちゃくちゃ人気があり、道を非正規化する必要があるかもしれませんが、あまりにも早く水を濁らせても意味がありません。



tagGroupのようなものがある場合、それをどのように処理するか、たとえば、タグはカテゴリにグループ化されます。例:プログラミング言語:c#、vb、pearl。OS:windows7、dos、linuxなど
Thunder

4
@Thunder:1つのタグが1つのカテゴリにのみ属していると想定して、category_idとcategory_nameで構成されるTagCategoryテーブルを作成します。そこから、category_idフィールドをTagsテーブルに追加して、結合を実行します。
Simon Scarfe、2011

114

データベーススキーマのタグ付けに関するPhilipp Kellerのブログ投稿を読んでください。彼は両方で、いくつかをしようと彼の結果を報告する一般的なクエリの構築の容易さの観点から、およびパフォーマンスの面で。タグの数、タグ付けされたアイテムの数、およびアイテムごとのタグの数がすべて要因でした。投稿は2005年からです。それ以降の更新については知りません。


19
これが最良の答えだと思います。これは、他のほとんどの回答のような仮定ではなく、実際のテストと研究に基づいています。
クリスティアン・ヴラビー

4
回答のリンクが機能していないようです。vtidter.blogspot.be/2014/02/database-schema-for-tags.htmlで
Christophe Herreman

8

実際、規模によっては、タグテーブルを非正規化する方が良い方法かもしれません。

このように、タグテーブルは単にtagid、itemid、tagnameを持っています。

タグ名は重複しますが、特定のアイテムのタグの追加/削除/編集がはるかに簡単になります。新しいタグを作成する必要はなく、古いタグの割り当てを削除して新しいタグを再割り当てするだけです。タグ名を編集するだけです。

タグのリストを表示するには、単純にDISTINCTまたはGROUP BYを使用します。もちろん、タグの使用回数も簡単にカウントできます。


4

少し標準的でないものを使用してもかまわない場合、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

パフォーマンスに関して徹底的に比較されたより多くのさまざまなオプションがあり、上記で提案されたものは全体的に最高です。


2

タグとアイテムの関連付けには、中間の3番目のテーブルを使用することをお勧めします。これは、タグとアイテムの間に多対多の関係があるためです。つまり、1つのアイテムを複数のタグに関連付け、1つのタグを複数のアイテムに関連付けることができます。HTH、バルブ。


1

質問で提供したデータに基づいて、速度の低下について話すことはできません。そして、開発のこの段階ではパフォーマンスについてあまり心配する必要はないと思います。それは時期尚早の最適化と呼ばれていますます。

ただし、TagsテーブルにTag_ID列を含めることをお勧めします。通常、すべてのテーブルにID列があることをお勧めします。


1

スペースが問題になる場合は、タグのテキストを格納する3番目のテーブルTags(Tag_Id、Title)を用意し、タグテーブルを(Tag_Id、Item_Id)に変更します。これらの2つの値は、一意の複合主キーも提供する必要があります。


0

アイテムには「ID」フィールドが必要で、タグには「ID」フィールドが必要です(主キー、クラスター化)。

次に、ItemID / TagIDの中間テーブルを作成し、そこに「Perfect Index」を配置します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.