2012-01-25 9 views
0

私は、データを可変深度で継承し、特定のデータの子孫を返す必要があるプロジェクトに取り組んでいます。私は地理的な地域で働いているので、私は "地域"のテーブルを持っていることを考えていたし、 "北米"から "ブロンクス"のような個々の近隣までのすべてを持っています。だから、「北米」の誰かの種類ならば、彼らはまた、「ブロンクス」の結果を受けなければならない「ブロンクスは、」私は計画していた私のDBに関係 North America->United States->New York(State)->New York(City)->BronxMySQLでの可変深度継承のモデル化

による「北米」の子孫であるので、リージョン間の親/子関係を指定するテーブルを使用して、自身へのRegionテーブル・リンクを戻します。ここに私が提案しようとしているものの例があります: enter image description here

何か助けていただければ幸いです!

+0

私は2つのテーブルのアプローチが好きです。しかし、 'In_Region.ID'カラムは必要ありません。主キーは '(ParentRegionID、ChildRegionID)'として設定できます。 –

+1

あなたのモデルは隣接リストと呼ばれます。階層的なデータを格納するための他のモデルもあります。この質問も参照してください:[どの階層モデルを使うべきですか?隣接、列挙型?](http://stackoverflow.com/questions/4831154/which-hierarchical-model-should-i-use-adjacency-nested-or-enumerated) –

+1

And this article:[階層データの管理MySQLで](http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/) –

答えて

0

新しいテーブルは必要ありませんか?メジャーテーブルの外部キーで十分です。

これは私のアプローチです:

まず問題、設計データスキーマ:私は親行への外部キーでhierarchis続けます。それは単純です。先祖/子孫を取得し、

WOE_ID ISO Name Language PlaceType Parent_ID 
20069843 "NA" "Oshana" ENG State 23424987 
55921113 "NA" "Ondangwa" ENG County 20069843 
... 

第二の問題:あなたはexample with hiererchy regions hereを持っているあなたが説明として、問題は、選択が付属しています:いくつかの地域とすべての子孫のOSの先祖を選択します。これを解決するには、新しいツリーテーブルを作成する必要があります。このテーブルには、ペアが含まれています。彼らは先祖のすべての(と自分自身)を持つ人へのアル組み合わせ:

region(id, name, id_parent) 
region_tree(id, id_ancestor, distance) 

Noticieこの構造の階層を照会することは容易であること。サンプル:いくつかの地域のすべての子孫:

select region.*, distance 
from 
    region p 
    inner join 
    region_tree t 
    on (p.id = t.id) 
where 
    id_ancesor = **someregion.id ** 

あなたが唯一のサブ領域、サブサブ領域を、取得する距離で遊ぶことができます...

最終問題、木を保つ:ツリーが必要すべての時間をデータにする必要があります。これを自動化する必要があります:region以上のトリガーまたはCRUD操作のストアプロシージャ