2016-12-24 11 views
0

私は、(stackoverflowタグに似た)新しく作成されたコンテンツにタグを付けるように求めるウェブサイトに取り組んでいます。しかし、このタグをどのように保存するのですか? 、mysqlデータベースを使用している場合、私は列の数とタグ自体の数に制限を設定する必要があります。私はどのアプローチに従うべきかをユーザーに無制限のタグ付けオプションを与えることを望んでいるので、無制限のタグをデータベースに保存する方法は?

+0

制限付きタグを使用すると、合計で20個と言えます。それから私は20列を作成し、いくつかのユーザーのタグを与えなかったと仮定します(これはほとんどの場合です)。このシナリオでは、ほとんどの列が空になります。このケースで何をすればいいのですか?テーブルエントリを空にしておくのは良い方法でしょうか? – Republic

答えて

5

これは古典的なとnとの関係です。このように

単一のコンテンツに複数のタグを格納するには、それぞれのタグのcontent_tagsテーブルにレコードを追加します。例:

content_tags table 
------------------ 
content_id | tag_id 
1   | 2 
1   | 5 
1   | 1 

、コンテンツレコードのタグを取得するには、実行します。

select t.* 
from tags t 
join content_tags ct on ct.tag_id = t.id 
join content c on ct.content_id = c.id 
where c.title = 'my content title' 
+0

ありがとうございます。限られたタグを使ってみると、合計が20であるとしましょう。それから私は20列を作成し、いくつかのユーザーのタグを与えなかったと仮定します(これはほとんどの場合です)。このシナリオでは、ほとんどの列が空になります。このケースで何をすればいいのですか?テーブルエントリを空にしておくのは良い方法でしょうか? – Republic

+0

私の答えで言及したデザインは、固定されているかどうかに関係なく、どれだけ多くのタグを選択するかということです。もし最大値があれば。 1つのポストにつき1つのタグがあれば、もちろんこのようにはしません。 –

0

私は、タグの名前を格納する別のテーブルを作成します。次に、外部キーを使用する必要があります。タグを選択すると、行の各エントリリンクがあなたのタグテーブル。そうすれば、タグテーブルに追加し続けることができるので、「無制限のタグ」を保存することができます。

-1

は、この問題にアプローチするために複数の方法があります。

  1. 他の答えが示唆するように、作成しますデータベース内のテーブルtagsを具体的に示します。これはこれを行う最も伝統的な方法です。たとえば、wordpressはtagscategoriesのテーブルを持ち、postsテーブルにリンクしており、ユーザーが発行した各投稿が格納されています。
  2. 別の方法は、別のtagsテーブルに格納するのではなく、jsonフィールド(現在のほとんどのデータベースにはmysqlとpgsqlを含む)にメインテーブル自体を格納することです。この利点は、1つの結合が削除されるため、クエリが高速になることです。欠点は、正規化の通常の利点、つまり効率的なストレージサイズが得られないことです。
  3. もう1つのメモやLOBフィールドに区切り文字を使用してタグを保存することもできます。カンマ区切り文字を使用すると、html,css,javascriptのようになり、処理するたびに区切り文字を使用して分割します。もちろん、デリミタ(この例ではカンマ)をタグの一部として使用できないという明らかな欠点があります。
+1

JOINを削除すると、何らかの形でクエリのパフォーマンスが向上するという考えは、間違っています – Strawberry

関連する問題