編集:タグ付けシステムを構築している人々へ。これを読まないでください。それはあなたが探しているものではありません。RDBMS にはすべて独自の最適化方法があることを知らなかったので、単純な多対多スキームを使用するだけで、これを尋ねました。
何百万もの投稿がある投稿システムがあります。各投稿には、無数のタグを関連付けることができます。
ユーザーは、メモ、作成日、所有者などを含むタグを作成できます。ユーザーはタグに関するメモを投稿できるため、タグはほとんど投稿そのものです。
各タグの関連付けには所有者と日付があるため、誰がいつタグを追加したかがわかります。
私の質問は、これをどのように実装できますか? タグまたは投稿ごとのタグで投稿をすばやく検索する必要があります。また、ユーザーはフィールドに名前を入力して投稿にタグを追加できます。これは、Google 検索バーのようなもので、タグ名の残りの部分を入力する必要があります。
現時点では 3 つの解決策がありますが、どれが最適か、またはより良い方法があるかどうかはわかりません。
タグの適切な解決策が得られれば簡単になるため、メモのレイアウトは表示していないことに注意してください。
方法 1. リンクされたリスト
post の tagId が tag_assoc のリンクされたリストを指している場合、アプリケーションは flink=0 になるまでリストをトラバースする必要があります
post: id, content, ownerId, date, tagId, notesId
tag_assoc: id, tagId, ownerId, flink
tag: id, name, notesId
方法 2. 非正規化
tags は、tagId:ownerId のタブ区切り配列を含む単なる VARCHAR または TEXT フィールドです。固定サイズにすることはできません。
post: id, content, ownerId, date, tags, notesId
tag: id, name, notesId
方法 3. トキシ
(から: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html、ここでも同じこと:タグまたはタグ付けのための推奨 SQL データベース設計)
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