3

PHPとmysqlを使用して、犬の血統を保存および読み取るための構造を作成しようとしています。

私はスタックオーバーフローでこの種の構造を見つけましたが、効率的であるようです: Inbreeding-immune database structure

TABLE people (id, name, father_id, mother_id );
TABLE relatives ( person_id, ancestor_id );

ここに実際の例があります: http://sqlfiddle.com/#!2/0bd39/10

ID で始まる順序付けられたツリーまたはサブツリー (たとえば、4 世代または 5 世代) を単純に取得することは可能ですか?

編集

最初のテーブルを使用してデータを取得しようとしています...しかし、4〜5世代では、結果のクエリは非常に重くなります。DB に大量の情報があると、家系図の取得が非常に遅くなり、使用できなくなるのではないかと心配しています。

SELECT 
    t1.name AS lev1, t2.name as f, ff1.name as ff1, fm1.name as fm1, t3.name as m, 
    mf1.name as mf1, mm1.name as mm1, .......
FROM people AS t1
LEFT JOIN people AS t2  ON t2.id = t1.father_id
 LEFT JOIN people AS ff1 ON ff1.id = t2.father_id
 LEFT JOIN people AS fm1 ON fm1.id = t2.mother_id
   ...
LEFT JOIN people AS t3  ON t3.id = t1.mother_id
 LEFT JOIN people AS mf1 ON mf1.id = t3.father_id
 LEFT JOIN people AS mm1 ON mm1.id = t3.mother_id
    ...
WHERE t1.id = 6;
4

2 に答える 2

4

この種のものは、おそらくデータ ストアのグラフスタイルにより適しています。Facebookが関係の階層を維持する方法に似たもの。

MySQL を使用することに固執し、決心している場合は、おそらく再帰検索を使用してスキーマを回避できます。ツリーの深さは可変である可能性があるため、特定の場所で自己結合を開始し、子孫が見つからなくなるまで再帰的に分岐を「ウォーク」することができます。そのブランチに戻り、次のブランチを開始します。親を見つけるためにトラバースするための同様のプロセス。

于 2013-02-18T14:39:27.420 に答える
1

私は魚の系統でこの問題を抱えていました。隣接リスト(あなたが投稿したもののような)をGraphVizのような専用のツリービルダーにダンプすることが最良の解決策であることがわかりました。

于 2013-02-18T14:34:56.050 に答える