3

私は、ユーザーが「タグ」を付けてファイルを分類できるようにするPythonプログラムに取り組んでいます。これらのタグは、相互に階層関係にある場合があります。たとえば、「cat」タグは「mammal」タグの「子孫」として分類できます。結果として、ファイルが「dog」としてタグ付けされると、「mammal」タグを介してアクセスすることもできます。

これらのタグとそれらの相互関係およびファイルとの関係は、明らかにデータベースに保存する必要があります。私はリレーショナルデータベースに最も精通しています。

再帰の必要がなくなり、必要なデータベースクエリが少なくなるため、リレーショナルデータベースにツリーを格納するためのModified Pre-orderTreeTraversalメソッドが非常に気に入っています。

ただし、複数の親を持つタグを容易にすることも必要です。たとえば、「犬」は「哺乳類」の子であり、「4本足のもの」の子である可能性があります。4本足のものすべてが哺乳類または動物(テーブルなど)であるとは限らず、「哺乳類」および「4本足のもの」 -thing'タグには「共通の祖先」はありません。

MPTTメソッドの利点のいくつかを維持しながら、データベースでそのような関係を表す方法を知っている人はいますか?

助けてくれてありがとう。

4

1 に答える 1

2

説明しているのは非循環有向グラフであり、ツリーではないため、MPTTのようなSQLの「ツリーストレージ」メソッドは使用できません。これは、この問題に対する隣接リストのアプローチを示す記事です。

ただし、実装の難しさのためではなく、ユーザーを混乱させてイライラさせるため、この道をたどらないことを強くお勧めします。私の経験では、ユーザーは複雑なオントロジーシステムをうまく利用しておらず、簡単に混乱します。親子関係のないフラットな「タグ」名前空間を使用するか、ノードごとに最大で1つの親を持つツリー配置を使用します。

しかし、グラフが必要な場合、彼の最も簡単な方法は、次のようなテーブルを作成することです。

CREATE TABLE tag_relationships (
    tag_child_id INTEGER NOT NULL REFERENCES tags (id) ON UPDATE CASCADE ON DELETE CASCADE,
    tag_parent_id INTEGER NOT NULL REFERENCES tags (id) ON UPDATE CASCADE ON DELETE CASCADE,
    PRIMARY KEY (tag_child_id, tag_parent_id)
);

再帰クエリを回避することはおそらくできないでしょう。一致する検索を作成する場合は、検索条件として使用しているタグを使用し、完全なタグリストが作成されるまで子タグを再帰的に追加します。

また、サイクルの作成にも注意する必要があります。関係を追加するときは、親を再帰的に訪問し、同じノードに2回到達しないようにする必要があります。

再帰クエリを回避し、サイクルの検出を支援するためにできることは、すべてのノードに対してすべての関係を明示的にすることによって、データを少し非正規化することです。つまり、AがBとCの子であり、CがDの子であるとします。

この事実を表すために必要なエッジの最小数の代わりに:

tag_child_id  tag_parent_id
A             B
A             C
C             D

すべての暗黙の関係(再帰を介して見つけなければならなかったもの)を明示的にします。

A             B
A             C
A             D
C             D

追加したことに注意してください(A, D)

于 2012-07-19T21:32:47.427 に答える