[pgsql-jp: 32652] Re: ツリー状のデータの取り扱い

Makoto Yui yuin @ bb.din.or.jp
2004年 4月 4日 (日) 04:59:49 JST


油井@最近Postgres触われてない人です.
この手の話題は好きなので,反応^^;

| メンテをさぼってネットサーフィンしてるとき
| Storing Hierarchical Data in a Database
|  http://www.sitepoint.com/article/hierarchical-data-database
| というのを見かけました。
| RDBで階層型のデータを扱う方法のけっこう面白いアイディアです。

リレーションを用いて木構造を表現するアイデアは
Joe Celko氏にSQL for Smarties: Advanced SQL Programming辺りが
最初に一般に紹介したところだと思います
(上の記事にも参考文献として出てますね).

| 詳細は記事を見てねというとなんだそれ?ってなるのでちょっと説明し
| ますと、ツリー状のそれぞれのノードの左と右に根っこの左から順に
| 数字を割り当てていくと、SELECT一発でいろいろ便利にできるよ、と
| いうものです。

範囲(Range)を用いた手法ですね.
ノードにpre-orderとpost-orderを付ければ,木を表現できるというものです.
リンクを用いる手法や文書順を使う手法もあります.

| cat_id指定でノードまでのパスをSELECTできる、WHERE用の関数をつくっ
| ても面白い、というか、左と右を完全に隠してしまうのがオブジェクトっ
| ぽいですかね?

この階層構造の話題は,順序木を扱うXMLの話題とほとんど一緒です.
私が以前作ったプロダクトではDOM L2 Core, XPath 1.0 (それぞれサブセットです)
が使えますので,よかったら触ってみて下さい.
#細井さんが上で述べておられたことと同等のことはできます.
http://gborg.postgresql.org/project/xpsql/cvs/co.php/XpSQL/doc/USAGE?r=1.5

# XMLドキュメント生成
sd01=# select createDocumentFragment ('xpsql.xml');
 createdocumentfragment
------------------------
                    143

# ルートノードを作成
sd01=# select addChildElement(143,'root');
 addchildelement
-----------------
             145
 
# ルートノードに要素を追加.
sd01=# select addChildElement(addChildElement(145,'first'),'second');
 addchildelement
-----------------
             147

# XPathで指定した目的の要素を抽出
sd01=# select * from xpath_evalx('/root//second');
 docid |      result
-------+-------------------
    13 | <second></second>

# ルートノード化をXMLとしてシリアライズ
sd01=# select toxml(143);
                     toxml
-----------------------------------------------
 <root><first><second></second></first></root>

# xpsql.xmlドキュメントのドキュメント要素を取得.
sd01=# select getDocumentElement(getDocument('xpsql.xml'));
 getdocumentelement
--------------------
                145
 
# 第一子のノード識別子を取得.
sd01=# select getFirstChild(145);
 getfirstchild
---------------
           146

# 識別子146(first要素)下のsecondという要素群の識別子を取得.
sd01=# select getElementsByTagname(145, 'second');
 getelementsbytagname
----------------------
                  147

+-------------------------------------------------------------------+
Makoto YUI <yuin @ bb.din.or.jp>
PGP public keyID: 9693FDA0
Key Fingerprint = 1ECA 3ADC 1CD1 0066 5EF4 0AA4 10B9 77EC 9693 FDA0 
+-------------------------------------------------------------------+



pgsql-jp メーリングリストの案内