Redmineチケットの階層化の実装方法
Redmineチケットのテーブルissuesテーブルにlft, rgtというカラムがVer1.0からあって、何に使うのか分かっていなかったが、下記の記事を読んでようやく理解した。
ラフなメモ書き。
【元ネタ】
【Redmine】issuesテーブルのlft・rgtって? | Roppi.net
SQLアタマアカデミー:第5回 SQLで木構造を扱う~入れ子集合モデル (1)入れ子集合モデルとは何か |gihyo.jp … 技術評論社
SQLアタマアカデミー:第5回 SQLで木構造を扱う~入れ子集合モデル (2)入れ子集合モデルにおける検索 |gihyo.jp … 技術評論社
SQLアタマアカデミー:第5回 SQLで木構造を扱う~入れ子集合モデル (3)入れ子集合モデルにおける更新 |gihyo.jp … 技術評論社
SQLアタマアカデミー:第6回 SQLで木構造を扱う~入れ子区間モデル (1)もしも無限の資源があったなら |gihyo.jp … 技術評論社
SQLアタマアカデミー:第6回 SQLで木構造を扱う~入れ子区間モデル (2)稠密性について|gihyo.jp … 技術評論社
SQLアタマアカデミー:第6回 SQLで木構造を扱う~入れ子区間モデル (3)フラクタルとしての入れ子集合|gihyo.jp … 技術評論社
Redmineでは、チケットやプロジェクトの階層を無制限に作ることができる。
モデリングにおいて、階層構造とはツリー構造のことであり、再帰構造になる。
ツリー構造はソフトウェアでは普通によく出る。
データモデリングでも、組織構造や部品表、工程表などの生産管理でツリー構造のモデルはよく出る。
RDBでは、ツリー構造の実装方法が面倒な事は以前から知られていた。
よくある例は、自分の親に当たるキーをセットして、Oracleなら再帰SQL(CONNECT BY)を使って問い合わせする。
しかし、階層構造が深くなると、再帰SQLの性能はすごく悪くなるため、テーブル構造を非正規化するバッドノウハウでモデリングする時も多かった。
上記の記事を読むと、階層構造は入れ子集合を使うと、ツリー構造をRDBに綺麗にマッピングできるらしい。
issues.lft, rgtは入れ子集合でツリー構造を表現した時、2次元の円の両端の座標を表している。
すると、チケットBの親がチケットAである場合、チケットA.lft<チケットB.lft<チケットB.rgt<チケットA.rgtという関係が成り立つので、このルールを使ってガントチャートを階層化して表示しているわけだ。
興味深い点は、上記の記事によれば、ドナルド・クヌースの古典的な教科書『The Art of Computer Programming』において、上記のアルゴリズムは既に提示されているのに、今まで誰もうまく使いこなせていなかったこと。
RDBMSを作った人達は、ツリー構造を再帰構造で表現することにこだわりすぎて、昔から知られているアルゴリズムに気付かなかったのかもしれない。
上記の記事を読むと、lftとrgtを整数から有理数へ拡張することによって、ツリーへの挿入や削除の処理の性能が良くなる点も指摘している。
その時の考え方として、数学に出てくる「稠密性」がある。
「稠密性」の例としては、古代ギリシャのゼノンのパラドックス「アキレスは絶対に亀に追いつけない」「飛ぶ矢は静止している」がある。
要は「無限」という概念の性質を表しているわけだが、こんな所でそういう考え方が出てくるとは思わなかった。
そんなことを考えると、Redmineのコミッタは、チケットやプロジェクトの階層化の実装方法について、とてもよく考えて作った事がよく分かる。
【追記1】なお、渡辺さんがRedmineのテーブル構造について参考になる記事を書かれているのでリンクしておく。
また、RailRoadと言うツールを使うと、Railsのコントローラやモデルなどの関連図を自動生成してくれる。
【追記2】
上記の記事はミックさんが書かれたらしい。
ミックさんのHPにもSQLでツリー構造を扱う内容が書かれている。
SQLで木と階層構造のデータを扱う(1)―― 入れ子集合モデル
SQLで木と階層構造のデータを扱う(2)―― 経路列挙モデル
「プログラマのためのSQL 第2版」や「達人に学ぶDB設計 徹底指南書
」にも入れ子集合モデルの話が掲載されている。
| 固定リンク
「モデリング」カテゴリの記事
- データモデリングではシステムが宿命的に負う複雑性をどのように解決しようとしているのか(2026.02.14)
- データモデリングの手法をあなたは持ってますか? at 関西IT勉強宴会(2026.02.11)
- 製造業のDXを推進する部門をITコーポレート部門に割り当てるとなぜ失敗するのか(2026.02.04)
- プ譜でプロジェクトの目的を管理する(2026.01.31)
- astahでPJ管理もプロセス設計もアイデア発想も全て表現したい(2025.10.25)
「Redmine」カテゴリの記事
- Redmine AI HelperプラグインはRedmineをAI駆動プロジェクト管理に変える可能性を秘めている #Redmine(2025.12.31)
- 第29回東京Redmine勉強会の感想~今話題のテーマはJTC運用とAIによるプロマネ作業支援 #redminet(2025.11.09)
- 第22回 Redmine大阪の感想 #RedmineOsaka(2025.09.21)
- RedmineJapan vol.4の感想part1~Redmine AI HeplerプラグインはRedmineのナレッジ活用を強化してくれる #RedmineJapan(2025.07.31)
- Jiraの機能はTracに似ている気がする #redmine(2025.06.01)


コメント