データベース設計のためのタグ付け
-
09-06-2019 - |
質問
いデザインのデータベースに以下のタグの特徴
- 項目で多数のタグ
- 検索のためのすべての項目をタグ付けを与えられたタグの要素の項目はすべてのタグで、AND検索、OR検索)
- 作成/書面項目が遅くなることがあるクルックアップ読み取り
理想的には、ルックアップのすべての項目をタグ付けに少なくともセットのnれのタグは使用できない単一のSQL文です。多くなっているので、今後は、このタグ検索などのタグのいずれかの項目が不明であり、using接合することは非効率的です。
そのアイデア?
全体の回答です。
がん間違いで、しかし、指定された応答がどのようなや検索タグです。(すべて選択項目としてのnタグ).もっと効率的とします。(全ての項目を選択している全てのnタグがします。)
解決
約ANDing:そのように思いま"の関係部門になります。 この記事 カバーの関係部門に簡潔に、かつcomprehendibleます。
約績ビットマップに基づく直感的にアプローチというので状況に応じます。しかし、私は納得するように実施のビットマップを割り出し"手"のように、digiguruる:そのような複雑な状況も新しいタグが追加されました(?) もDBMSes(Oracleの提供すビットマップ指数がなんとかできるので、内蔵の索引システムからの可能性の複雑さの指数ラインナまた、DBMSビビットマップ指数の動きを検討し適切な場合、クエリプランです。
他のヒント
こちらの記事にタグ付けのデータベースシステムの主要なテーマ:
http://howto.philippkeller.com/2005/04/24/Tags-Database-schemas/
と性能試験:
http://howto.philippkeller.com/2005/06/19/Tagsystems-performance-tests/
この結果が特定のMySQLは、少なくとも2005年の時に書かれたたも全文を割り出します。
きというものはないと思い問題を素直に解テーブル、テーブルタグ、crosstableのための"タグ"
インデックスのクロスする場合、それぞれ十分な最適化.選択項目が
SELECT * FROM items WHERE id IN
(SELECT DISTINCT item_id FROM item_tag WHERE
tag_id = tag1 OR tag_id = tag2 OR ...)
やタグ付けする
SELECT * FROM items WHERE
EXISTS (SELECT 1 FROM item_tag WHERE id = item_id AND tag_id = tag1)
AND EXISTS (SELECT 1 FROM item_tag WHERE id = item_id AND tag_id = tag2)
AND ...
は確かに効率がよくないので多数を比較するとまることが期待される。の場合の維持にタグをカウントのメモリがクエリの開始タグが付いていないことが多いので、配列が評価されるであろう。によって予想数のタグとして認めることができると期待のマッチングルのこOK溶液の場合20のタグおり、一部のランダム商品一致15れていることが重データベース化します。
そう思ってやってきました表された、@Jeff Atwoodへのリンク(http://howto.philippkeller.com/2005/04/24/Tags-Database-schemas/ は非常に徹底でつくれるのでメリットを3つの異なるスキーマのアプローチとソリューションの問い合わせることは通常どのように絡んでいるのかを調べてであることが明らかにされた。で(を使用しませんので、相関サブクエリの各ップを開催いたします。も盛りだくさんのいいもの。
ps-のアプローチする言葉でこちらとしての"Toxi"ソリューションとなります。
するために実験とのない厳密にデータベース溶液のように Javaのコンテンツリポジトリ 実施例 Apache Jackrabbit 引用検索エンジンの上に構築されるように Apache可能.
このソリューションは、適切なキャッシュ機構がある利回り以上のパフォーマンスを、自家栽培した。
しかし、どうかと思いる中小アプリケーションが必要とされる高度な実施による正規化されたデータベースを応用した先します。
編集:とを明らかな利用JCRのようなソリューションと検索エンジンです。が大きく簡素化プログラム。
最も簡単な方法を タグ 表に示す。
Target_Type
--ているタグの複数のテーブル
Target
--キーに記録されタグ付き
Tag
--テキストのタグ
タデータのようなものです:
Select distinct target from tags
where tag in ([your list of tags to search for here])
and target_type = [the table you're searching]
更新
要件に基づいて、条件に、上記のクエリーがにこのようになっ
select target
from (
select target, count(*) cnt
from tags
where tag in ([your list of tags to search for here])
and target_type = [the table you're searching]
)
where cnt = [number of tags being searched]
私の第二@Zizzencs策が必要であるということにならない(R)DBを中心と
なんだかと思いることを平nvarcharを格納するタグの一部の適切なキャッシュ-割り出しが収量を高速化。った。
私の実施のタグ付けシステムの3つのテーブルを表すのに多対多の関係(項目のタグItemTagsものと思いますの対応タグにはもちろん、都心観光などでお伝えすることは3つのテーブルを操作/照会されると同時に全ての時間んだコードを複雑にしています。
も考えておいた方がよいでしょうがより複雑で使い勝手は大きく変わります。
することはできません回避でき入がやや正規化されます。
私のアプローチをしているタグ。
TagId (PK)| TagName (Indexed)
その後、TagXREFID列のコンテンツ内の情報。
このTagXREFID列がFKを、3テーブルまでTagXREF:
TagXrefID | ItemID | TagId
なので、すべてのタグの項目のようなものです:
SELECT Tags.TagId,Tags.TagName
FROM Tags,TagXref
WHERE TagXref.TagId = Tags.TagId
AND TagXref.ItemID = @ItemID
およびすべての項目をまとめたタグも、今までのものを使っておけば間違いないようになります:
SELECT * FROM Items, TagXref
WHERE TagXref.TagId IN
( SELECT Tags.TagId FROM Tags
WHERE Tags.TagName = @TagName; )
AND Items.ItemId = TagXref.ItemId;
に々ソフトバンクグループのタグと、更に上記の計算書若干の追加およびタグです。TagName=@TagName1としています。TagName=@TagName2など、動的に構築を返します。
私のようになって違いますので、以下のテーブルを代表するrawデータであり、この場合におい
Items (ID pk, Name, <properties>)
Tags (ID pk, Name)
TagItems (TagID fk, ItemID fk)
この作品は高速書き込み時、全て正規化され、また各タグをする必要がありまテーブルを追加回毎に更したいタグとなった遅読み出します。
解決策の改善を読をキャッシュテーブルのコマンドによる設定保存手順は本質的に新しいテーブルを表すデータを平坦化された形式...
CachedTagItems(ID, Name, <properties>, tag1, tag2, ... tagN)
したときにどのように多くの付いた項目テーブルのニーズをいたしますのでご確認ください日の場合は毎に挿入し、その保存手順にカーソルを挿入します。までの時間、その設定時間を実行します。
今になデータの検索、また保存されている手続からデータのタグです。により入れ子のクエリは、大量の場合は、渡したい単一のパラメータのリストを含むタグを選択したいデータベースから、記録に設定しています。このベースにバイナリ形式をビット単位です。
バイナリ形式で伝えできたらと考えております。ということかなりのタグを変更することもでき項目を、バイナリーまで表示する
0000
場合は全てのタグは指定されたオブジェクト、オブジェクトのようになります...
1111
場合、二---
1100
それだけの場合はバイナリ値の1s及びゼロにしています。まさにSQLサーバーを使のビット単位で事業者に確認することができることが1の最初のカラムを非常に簡単なる機会はあまり多いとはい
チェックこのリンクを見出 以上.
に言えいフレキシビリティなんてできないの スキーマ, での クエリ.
のナイーブのスキーマの主体-ラベル-タグは右かかるものと思われます。ものとしていませんので直ちに明らかを実行するには、クエリのタグです。
最良の方法の最適化をクエリするプラットフォームに依存するようなのでお勧めしre-タギングのご質問はおRDBS変更のタイトルのようなもの"の最適化を行うと、クエリー、タグのデータベース".
いくつかの提案MS SQLものを差し控えさせていただいてお場合とないのだ。
の変化に応答するか、タグのidでソートして、結合として^分離文字列のハッシュします。それだけにハッシュ。それぞれの組合せのタグ生成ます。い-検索だけのハッシュ、指定されたタグidを検索する変化するタグのアイテムが原因のハッシュするに再現しています。項目のタグが同じハッシュ。
だ配列タイプで、前の集計に必要なデータです。この答えに別個のスレッド: