[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 メーリングリストの案内