高速の関係法の保存樹木のデータ(インスタンスネジメントの記事)
-
21-08-2019 - |
質問
いcmsが格納されているコメントに対す。これらのコメントを見つけることができますネジ付きの外部です。が技術的には同じだと回答欄を空白がでない部です。自作sqlLite、MySQL、pgsqlながらやっていく必要があるかなりの標準SQL.
私は現在、バンプマッピングテーブル
comment_id
article_id
user_id
comment
timestamp
thread (this is the reply column)
私の質問は、どのワールドカップのネジ付きコメントのデータベースです。もしかすると、別のテーブルを支援するツリーの設定なしに内容を簡単にテーブルのテキストを使うことができます。ものです。もおいしいそうです。
の場合はコメントが国連のネジ切りが容易にできまばめの時刻です。
ばねっこのように並べ替え
ORDER BY SUBSTRING(c.thread, 1, (LENGTH(c.thread) - 1))
これを見ていただきますと、順、コメントをクエリーまで今までにない使用を指標としての機能に基づく指標にのみ生ますので、Oracle社助けてくれて非常に高速のコメントする。
解決
いか Drupal この問題を解決し.でランク付けスレッドid。このidで始までの1のための最初のコメントとなります。場合は返信できるのがコメントのid 1.1
が付けられています。返事へのコメント 1.1
指定のスレッドid 1.1.1
.-兄弟姉妹のコメント 1.1
指定のスレッドid 1.2
.のアイデアです。計算これらのスレッドidに実行できる一つのクエリがコメントが追加されます。
スレッドが描画される全てのコメントに所属するスレッドがフェッチされる単一クエリでは、別のスレッドidです。このスレッドの昇順です。さらに、スレッドidは、ネスレベルのコメント、インデントします。
1
1.1
1.1.1
1.2
1.2.1
あの問題を整理:
- 場合は一部のスレッドidが2桁の選別によるスレッドidが発生することはありませんが期待する。りやすく解は、全ての部品のスレッドidの違いによる頭に同じ幅になります。
- 選別による降のスレッドidが発生しないの降順です。
Drupalを解決の問題をより複雑な方法を使用し番号と呼ばれるシステムvancode.第二の目的については、課題、解決を追加することによってバックスラッシュ(ASCIIコードは桁の数字をスレッドidが選別による降順です。きの詳細についてこの実装をチェックすると、ソースコードの コメントモジュール の大きなコメント前の機能comment_get_thread).
他のヒント
私の答えは少し遅いが、ツリーデータの利用停止テーブル http://www.slideshare.net/billkarwin/models-for-hierarchical-data
で記述する4つの方法
- Adjcencyリストの単純な親会社の外部キー)
- パスの列挙型のシステムを変更戦略の受け入れで解答)
- 入れ子のセット
- 閉鎖のテーブル(格納先祖/その子孫の事実は別の関係[テーブル"より、可能な距離列)
最後のオプションの利点やCRUD事業との比較についてご覧いただけます。のコストはスペースの中で、O(n^2)のサイズのツリーノードの最悪の場合にはできなかったが、おそらくいます。
残念ながらの純粋なSQLの方法では非常に遅くなります。
の NESTED SETS
提案する @Marc W
も優雅なものが必要ですの更新をツリー全体が木の枝の範囲で非常に遅くなります。
この記事なんかで高速に MySQL
:
- 階層的クエリにMySQL -模倣した
Oracle
'sCONNECT BY
して作成していただく必要があり、機能:
CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE _id INT;
DECLARE _parent INT;
DECLARE _next INT;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;
SET _parent = @id;
SET _id = -1;
IF @id IS NULL THEN
RETURN NULL;
END IF;
LOOP
SELECT MIN(id)
INTO @id
FROM t_hierarchy
WHERE parent = _parent
AND id > _id;
IF @id IS NOT NULL OR _parent = @start_with THEN
SET @level = @level + 1;
RETURN @id;
END IF;
SET @level := @level - 1;
SELECT id, parent
INTO _id, _parent
FROM t_hierarchy
WHERE id = _parent;
END LOOP;
END
使ってクエリのようになります:
SELECT hi.*
FROM (
SELECT hierarchy_connect_by_parent_eq_prior_id(id) AS id, @level AS level
FROM (
SELECT @start_with := 0,
@id := @start_with,
@level := 0
) vars, t_hierarchy
WHERE @id IS NOT NULL
) ho
JOIN t_hierarchy hi
ON hi.id = ho.id
このコース MySQL
特定のものです
また携帯布 PostgreSQL
や MySQL
, 利用でき PostgreSQL
's contrib用 CONNECT BY
し、組み込みスクリプトをクエリに保存されている手順と同じ名前の両方のシステム。
私は実際には、これを自分でやりました!私は、リレーショナル・データベース内の階層データを表すの入れ子集合モデルを使用します。
MySQLのの中で階層データを管理することは、私にとって純金ました。ネストされたセットは、その資料に記載されている第2のモデルである。
あなたは隣接してネストされたセットモデル間の選択肢を持っています。記事素晴らしい紹介になりのMySQLで階層データを管理します。
は、理論的な議論については、Celkoの木と階層のを参照してください。
これは、データベースがウィンドウ関数をサポートしている場合、ねじリストを実装するために、むしろ簡単です。
:必要なのは、次のような、ターゲット・データベース・テーブル内の再帰的な参照ですcreate Tablename (
RecordID integer not null default 0 auto_increment,
ParentID integer default null references RecordID,
...
)
これで、スレッドビューを表示するには、再帰共通テーブル式を使用することができます。例はここをhref="http://blogs.conchango.com/christianwade/archive/2004/11/09/234.aspx" rel="nofollow noreferrer">利用できる
実際には、読み出しと書き込みの間のバランスである必要があります。
あなたはすべての挿入時に行の束を更新してOKである場合、ネストされたセット(または同等)が簡単にあなたを与えるだろう。、高速な読み込みます。
それ以外は、親に対する単純なFKはあなたに、超簡単な挿入を与えるだろうが、うまく検索のための悪夢かもしれません。
私は(いくつかの更新私は、ネストされたセットで行くが、予想されるデータの量と使用パターンについての注意が必要と思うの多くは、おそらく、すべての挿入のための左右の情報のための2つのインデックス付きの列上の行は、()かもしれません)いくつかの点で問題になります。