2011-02-08 10 views
2

私は現在、小さなブックマークアプリケーション用のデータベースを設計しています(MySQLを使用しています)。タグシステムで賢明なことをしたいと思います。最初は問題ではありませんが、スタックオーバーフローのタグ同義語に似たようなものを実装したいと思います。ここでは、各タグに複数のサブタグを割り当てることができます。これは、例えば、「こんにちは」とタグ付けされたブックマークを返すための「hi」のタグ検索を可能にする。Stack Overflowのタグ同義語に似た機能を提供するタグスキーマ

私は、 'tags'、 'posts'、 'posts_tags'の3つのテーブルを持つ多対多のタグシステムを構築することに慣れています。これに同義語を適合させたいと思います。

私の最初の考えは、各タグにマップするタグのIDを含む「親」フィールドを持つことができたということでした。しかし、これは孤立したタグが多数発生し、管理が悪夢になることがあります。私はスピードとエレガンスを探しています。

誰かがアイデアやガイダンスを持っていれば大変感謝しています。ありがとう

答えて

1

親子テーブルを使用できます。例えば、ChildToParentTagsテーブルのPKとしてchildTagIdを使用

 
Tags 
tagId, pk 

ChildToParentTags 
childTagId, pk, fk (pk of this table, fk into Tags table) 
parentTagId, fk (fk into Tags table, have an index for this column). 

Post 
postId, pk 

assume many-to-many post to tag relationship 
PostToTag 
postId, pk 
tagId, pk 

は0又は1親にタグを制限するが、親は複数の子を持つことができます。タグにより、ポストのため

問合せ:

 
select 
post.postId, 
post.otherStuff 
from 
post 
    inner join postToTag on 
    post.postId = postToTag.postId 
    inner join tag on 
    postToTag.tagId = tag.tagId 
where 
tag.something = 'desired tag value' 
+0

ああ。タグで投稿を表示するには、2つの結合を実行する必要がありますか? – Rowan

+0

はい、タグから投稿までの2つの結合 - that-that-that-that-tagです。また、いいえ。 tagIdがタグ名(例: "java"または "schema")の場合、タグテーブルに結合をドロップできます。 – DwB

0

あなたがグループを割り当てシステムを使用することができます。上記のような親子関係の作成はあまり役に立ちません。グループ関係を作成すると、検索が高速になります。

グループと呼ばれるテーブルを作成 -

id, name, groupid 

を同義語である各要素は、(番号が割り当てられたコードであることができる)のgroupIdを割り当てなければなりません。要素の移動があったり、新しい要素がグループに割り当てられたり、既存の要素がグループから移動されたりするときは、必ずgroupidを更新するだけです。

これは検索を高速化します。何かを検索する必要があるときには、必ずgroupidを検索するだけです。同じgroupidを持つすべての要素は、IN句を必要とせずに検索できます。

私はこのテーブルが他のテーブルとFKの関係にあると仮定しています。 FKの関係があれば、PK-FKの関係で "id"を使うのではなく、 "groupid"をFKの関係にすることができます。

関連する問題