木について少し

エントリー



リレーショナルデータベースにツリー構造のストレージを実装する必要がある状況に遭遇しましたか?



ツリー上のPostgreSQL



多くの例があります。 これらは、ツリーのようなコメント、製品カタログ、および和解であり、国および地域ごとに分けられています。 誰でも独立していくつかの例を挙げることができると思います。



このトピックでは、PostgreSQLのツリーストレージを整理するために存在する機能の1つであるltreeについて説明します。



設置



インストールプロセスは、debianライクなシステムについて説明されます。



  1. postgresql-contribパッケージをインストールする必要があります。
  2. psql -U postgres -dデータベース名-1 -f SHAREDIR / contrib / ltree.sql-モジュールの内容をデータベース名データベース(SHAREDIR-共有PostgreSQLデータのあるディレクトリ)に注ぎます
  3. ...
  4. 利益!




簡単な説明



ltreeでは、 ラベルの形式でツリー構造を保存することができ、それらに対して広範な検索機能も提供します。 [1、2]。



ラベルは、ラテンアルファベットの文字、数字、およびアンダースコアで構成できます。 ラベルから、ltreeに保存されるパスを作成できます



ラベルパスは、ピリオドで区切られた0個以上のラベルのコレクションです。 パスを検索するには、特別なクエリlqueryを使用します。



Lqueryの例:

  1. foo-fooと正確に等しいラベルパスを持つレコード。
  2. foo。*-ラベルパスがfooで始まるレコード。
  3. * .foo。*-ラベルパスにfooが含まれるレコード。




Lquery修飾子:

  1. * {n}-パスには正確にn個のラベルが含まれます。
  2. * {n、}-パスには少なくともn個のタグが含まれます。
  3. * {n、m}-パスにはn〜m個のタグが含まれます。
  4. * {、m}-パスにはm個以下のタグが含まれます。




さらに、ラベルの修飾子があります。

  1. foo *-fooで始まるラベル。
  2. foo @-大文字と小文字を区別しないラベル。たとえば、Foo、FOO、FoO-実行します。
  3. foo%-foo_barを選択しますが、fooとfoobarは選択しません。




修飾子は組み合わせることができます。



ltreeは、それ自体とc lqueryの間で比較できます。 標準の比較演算=、<>、>、<、> =、<=は完全にサポートされています。 それらに加えて、さらにいくつかの操作が導入されました。

  1. ltree @> ltree-式の左のメンバーが右の祖先かどうか。
  2. ltree <@ ltree-式の左のメンバーが右の子孫であるかどうか。
  3. ltree〜lqueryまたはlquery〜ltree-ltreeがlqueryのクエリと一致するかどうか。




操作と機能の完全なリストは、公式ドキュメント[2]にあります。



使用例



木について少し学びました。 例を実装してみましょう。



国-地域-都市という形で領土単位の保管を実現するという課題に直面しています。



テーブルを作成します。

create table "world" ( "id" serial primary key, "name" varchar(150) not null, "tree" ltree not null );
      
      





データを入力します。

  id | name | tree ----+----------------+------- 1 |  | 1 2 |  | 2 3 |  | 3 4 |  | 1.4 5 |  | 1.4.5 6 |  | 1.4.6
      
      





そして今、情報を取得する簡単な方法があります。 たとえば、すべての国のリストを取得するには、次のクエリを実行します。

 select "id", "name" from "world" where "tree" ~ '*{1}'
      
      





ロシアのすべての地域を受け取るには:

 select "id", "name" from "world" where "tree" ~ '1.*{1}'
      
      





このツールの使用例は数多くあります。 しかし、このトピックの可視性により、これについて詳しく説明します。



おわりに



ltreeはツリー構造を整理するのに最適な方法であるように思えます。 情報を検索およびソートするためのシンプルで便利な方法のおかげで、幅広いタスクに適しています。



この記事では、ltreeのすべての機能とはほど遠いリストを示しました。 インデックス作成、関数、およびltxtqueryの全文検索の問題の問題はまったく対処されませんでした。 完全なドキュメントは、以下のリンクで見つけることができます[1、2]。



一般に、PostgreSQLには多くの有用な追加モジュールがあります[3]。 素敵な勉強をしてください!



参照資料



  1. 開発者のサイトにあるltreeの説明
  2. PostgreSQL ltreeの説明
  3. PostgreSQL Contribモジュール



All Articles