EDIT:ビルタギングシステムの人に。これを読まないでください。あなたが探しているものではありません。私は、RDBMSがそれぞれ独自の最適化手法を持っていることに気付かずに単純な多対多スキームを使用するだけで、この質問をしました。スケーラブルデータベースのタグ付けスキーマ
私は数百万の投稿を持つ投稿システムを持っています。各投稿には、無限の数のタグが関連付けられています。
ユーザーは、メモ、作成日、所有者などを持つタグを作成できます。タグは、タグに関するメモを投稿できるため、ほとんどは投稿自体に似ています。
各タグの関連付けには所有者と日付があります。そのため、誰がタグを追加したのか、また誰がいつ表示されるのかがわかります。
私はこれをどのように実装できますか?これは、タグによる投稿の高速検索、または投稿によるタグの検索が高速でなければなりません。また、ユーザーは、Google検索バーのようなフィールドに名前を入力することで、タグ名の残りの部分を入力する必要があります。
私は現時点で3つの解決策を持っていますが、どちらが最善か、より良い方法があるかはわかりません。
タグの適切な解決策を取得すると、私はメモのレイアウトは表示されません。
方法1リンクリスト
はtagId tag_assocにリンクされたリストに後の点で、アプリケーションは、方法2非正規化
タグ= 0
post: id, content, ownerId, date, tagId, notesId
tag_assoc: id, tagId, ownerId, flink
tag: id, name, notesId
FLINKまでリストを横断しなければなりませんTagId:ownerIdのタブで区切られた配列を含むVARCHARまたはTEXTフィールドです。固定サイズにすることはできません。
post: id, content, ownerId, date, tags, notesId
tag: id, name, notesId
方法3 Toxi
(から:http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html、 ここにも同じ事:Recommended SQL database design for tags or tagging)
post: id, content, ownerId, date, notesId
tag_assoc: ownerId, tagId, postId
tag: id, name, notesId
方法3は、問題を提起、どれだけ速くそれは、すべてを反復することになりますtag_assocの単一行ですか?
方法1と2は、タグでポストを返す場合は高速にする必要がありますが、タグでポストを行う場合は、別のルックアップテーブルを作成する必要があります。
最後に心配しなければならないのは、タグを名前で検索して最適化することですが、私はまだそれを解決していません。
私はここASCII図を作っ:http://pastebin.com/f1c4e0e53
タグは投稿間で共有されます。 私はかなり方法3を決めました。タグを持つことができるすべてのテーブルには_tagsという別のテーブルがあります。 EG:news_tags。 私はこの方法ではまだまだスケッチですが、誰もがそれを推薦しているようですので、MySQLが最適化すると仮定しています。 –
"仮定" - 悪い考え。知っている方が良いです。 – duffymo