再帰SQL
Javaやモデリングを検索すると、2chのスレッドにたどり着いてしまうのだが、面白い記事を見つけた。
「部品表から、未来のある時点での在庫の推移・過不足を見たいが、どのようなデータモデリングとSQLを使えばよいのか?」という質問に対し、「再帰SQLを使うしかないだろう」という答えがあり、下記のリンクが張られていた。
オブジェクト指向、Javaを取り入れた新しい業界標準「SQL99」詳細解説 (共通表式 WITH句/再帰SQL)
共通表式は、外部結合等でFROM句にあるサブクエリを何度も使わざるを得ない時に使った経験があるので知っていたが、再帰SQLについては知らなかった。
上記HPの例題を読むと、「部品構成表から、自転車を構成する全部品と各部品の所要数の一覧を作る」時のSQLが再帰SQLとして書かれている。
更に、「パリからサンフランシスコまでの乗り継ぎのある経路のうち、最少費用の経路を探す」ためにも再帰SQLを使っている。
こんな問題の解決に再帰SQLを使うんだなーと感心した。(感心してはいけないが)
この方法は、MSProjectで作ったスケジュール表のリソース平準化のアルゴリズムにも使われているのだろうか?
クリティカルパスの検索や工数最適化にもこのアルゴリズムは使えるのではないか?
再帰SQLを使えば、最短経路検索の問題が全て解けてしまうのでは?と思ってしまうが、無限ループの問題とかあるみたい。
上記の記事には、再帰SQLの他に、渡辺さんの本「生産管理・原価管理システムのためのデータモデリング」に載っている「LLCを使ってシングルレベル展開して最後の階層まで集計する」アルゴリズムが回答されていた。
LLC(ローレベルコード)の意味は、「ある部品が部品構成表でどれくらい最下位にあるかを示す位置」なのだが、恥ずかしながら僕もLLCの使い道がよく分かっていなかった。
渡辺さんの本にある「MRPの所要量計算アルゴリズム」は理解し切れていないけれど、再帰SQLのアルゴリズムと似ている感じがするのだが、正しいだろうか? もう少し考えよう。
| 固定リンク
「プログラミング」カテゴリの記事
- Rietveld のインストール方法(2009.10.25)
- 形式手法とHaskellについてメモ(2009.10.15)
- プログラミング言語の進化はベストプラクティスをサポートするためにある(2009.09.25)
- 『~ It!』シリーズの本は良書(2009.09.14)
- Mavenで開発ライフサイクルを制御する(2007.11.04)
「プロジェクトマネジメント」カテゴリの記事
- 【公開】SPES2009、SQIP2009の論文資料(2009.11.04)
- Redmineのチケット集計機能を強化するプラグイン(2009.11.09)
- チケット駆動開発にPMBOKの概念を導入してみる(2009.11.08)
- 【再考】TiDDのプラクティス集(2009.11.06)
- TiDDにITILの概念を持ち込む(2009.11.05)
「モデリング」カテゴリの記事
- マネジメントのスピードが開発のスピードに直結する(2009.11.01)
- モデル検査ツールLTSAのメモ(2009.10.06)
- マインドマップのメモ(2009.10.06)
- ユースケース駆動開発実践ガイド(2008.05.04)
- XDDPと言う派生開発(2009.07.19)
「日記・コラム・つぶやき」カテゴリの記事
- CMMの構成管理はバージョン管理システムと同じか?(2004.08.13)
- 手配師になるか技術屋で生き残るか(2005.06.25)
- GanttProjectは使える?(2004.12.29)
- プログラム=インターフェイス+アルゴリズム+データ構造(2005.11.22)
- XP祭り2005の感想(2005.09.04)


コメント
ローレベルコードの使用目的は主に二つです
一番重要な目的は,所要量計算(あるいは原価計算)を行う品目の順序を決定するというものです(P175を参照).所要量計算を行うためには,親品目からの所要量の総計が必要なので,すべての親品目の所要量計算が完了しなければ該当品目の計算を行うことができません.品目ごとに付けられているローレベルコードの昇順で計算すれば(ただしMRPの計算の単位が品目だけという前提においてですが),かならず親品目の計算が完了した順序で計算できる,というわけです.
次にもう一つよく使われるのが,部品構成のループのチェックです.ループについてはP124の図2を参照してください.このチェックは非常に重いものなのですが,ローレベルコードの振り直しが必要でないような場合はチェックする必要がありません.
投稿: yuuntim | 2005/07/14 20:57