- PR -

直列化のアルゴリズムを自分で実装したい

投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2005-09-13 11:35
こんにちは。

現在、VB.NET2005+SQL Serverで開発しています。

あるツリー構造を持ったオブジェクトを、SQLサーバのテーブルに保存しようとしています。

ツリーオブジェクトの1つのノードは1つのクラスで、かつ1つのテーブルの1レコード
に相当します。

このツリー構造(階層は3階層までで単純なもの)のオブジェクトをRDBという2次元
のデータベースに保存するのに自分でシリアライズ/デシリアライズ処理を実装した
いのですが、そのためのアルゴリズムを検討しているのですが、なにか参考になるもの
をご存知の方はおられませんか?
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-09-13 11:50
maruさん、こんにちは。

引用:

現在、VB.NET2005+SQL Serverで開発しています。


ってことは、SQLServcer も2005だったりします?
であれば、XML型の列を使うという手もありますよね。
葉瀬崎浩樹
大ベテラン
会議室デビュー日: 2005/06/28
投稿数: 115
お住まい・勤務地: 兵庫県
投稿日時: 2005-09-13 12:02
んーと、ぼんやりとした回答でしか返せませんが。

ノード格納するDBテーブル例
コード:

テーブル名:TNodeInfo
--+--------+----------
ID|ParentID| TEXT
--+--------+----------
1 | Null|'スポーツ'
2 | 1| '野球'
3 | 1|'サッカー'
4 | 2| '阪神'
5 | 2| '巨人'
6 | Null| '読書'
7 | Null| '食欲'



ツリー構造の保存は、こういう形式のテーブルで行うのが一般的かと思います。
(敢えて単純に書いてます)

このデータをSELECTした結果を
再帰処理してやれば、デシリアライズと直列化を行えます。
シリアライズは、単純に全てのノードをInsert・Updateするだけです。

これで回答になりますかね?
#昼食挟んで用語訂正・文章校正

[ メッセージ編集済み 編集者: 葉瀬崎浩樹 編集日時 2005-09-13 13:00 ]
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2005-09-13 12:07
きくちゃんさん、こんにちは。
返答ありがとうございます。

ただ・・・

>であれば、XML型の列を使うという手もありますよね。
よくある販売システムで、ある伝票データなのですが、ヘッダ部と明細部に分かれて
いて、その明細部がデータ的には階層構造を持っています。

今のところは、その明細テーブルに、行Noとツリー構造用の親行Noの列を持たせてい
ます。その行Noと親行Noを使って、データベースからデータを取り出し/書き込みする
時点で、ツリー構造の組み立てや直列化をしたいのです。

XML型には興味はありますが、今回はテーブルも階層構造以外は良くあるRDB型の
テーブルなので、XML型を使うなどあまり特殊なことはしたくありません。
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2005-09-13 13:06
葉瀬崎浩樹さん、こんにちは。
返答ありがとうございます。

テーブル構造と再帰処理を使うことは分かっていたのですが、いざプログラミング
しようとしたときに、再帰処理で頭がぐるぐるぐるぐる・・・・<(@_@)>

脳みそが再帰です。

何か参考になるサイトを探しています。
葉瀬崎浩樹
大ベテラン
会議室デビュー日: 2005/06/28
投稿数: 115
お住まい・勤務地: 兵庫県
投稿日時: 2005-09-13 13:32
引用:

maruさんの書き込み (2005-09-13 13:06) より:
テーブル構造と再帰処理を使うことは分かっていたのですが、いざプログラミング
しようとしたときに、再帰処理で頭がぐるぐるぐるぐる・・・・<(@_@)>



お悩みはその点でしたか。。
サイトではないですが、参考になれば。
VB6で、TreeViewにMeisaiのNodeを追加する処理です。
#やっつけでこさえたので、大体の雰囲気を掴んでいただけたら。。
コード:

'再帰しながらツリーを構築する
Private Sub BuildTree(meisai As CMeisai)

Dim Key As String
Dim PKey As String

'ツリーに登録済みの場合、再帰中断
If meisai.DoneAdd Then
Exit Sub
End If

Key = "KEY:" & meisai.Number
PKey = "KEY:" & meisai.parentNumber
If meisai.parentNumber >= 0 Then
'親ノードを先に追加する。(再帰呼び出し)
Call BuildTree( m_MeisaiFactory.Items(meisai.parentNumber) )
Call tree.Nodes.Add(PKey, tvwChild, Key, meisai.Name)
Else
'親ノードが無いので、ルートとしてツリーに追加
Call tree.Nodes.Add(, , Key, meisai.Name)
End If
'二重登録回避用のフラグ
meisai.DoneAdd = true

End Sub

Private Sub MakeTree()

'明細オブジェクトの生成・コレクションへの追加
Call m_MeisaiFactory.CreateOne(1, "スポーツ")
Call m_MeisaiFactory.CreateOne(2, "野球", 1)
Call m_MeisaiFactory.CreateOne(3, "阪神", 2)
Call m_MeisaiFactory.CreateOne(4, "巨人", 2)
Call m_MeisaiFactory.CreateOne(5, "サッカー")
Call m_MeisaiFactory.CreateOne(6, "読書")
Call m_MeisaiFactory.CreateOne(7, "食欲")

'ツリーに追加
Dim meisai As CMeisai
For Each meisai In m_MeisaiFactory.Items
Call BuildTree(meisai)
Next

End Sub



MeisaiFactory.CreateOneでは、CMeisaiのインスタンスを作って、
Itemsコレクションに追加しております。
#VB6には、コンストラクタが無いので。。

#サンプルソース修正・コメント追加
#コメント追加・日本語修正orz
[ メッセージ編集済み 編集者: 葉瀬崎浩樹 編集日時 2005-09-13 13:37 ]

[ メッセージ編集済み 編集者: 葉瀬崎浩樹 編集日時 2005-09-13 13:45 ]
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2005-09-13 13:59
葉瀬崎浩樹さん、わざわざすいません!!

感謝です

これを元に、VB.NET+SQLServerで使えるように改造してみます。
葉瀬崎浩樹
大ベテラン
会議室デビュー日: 2005/06/28
投稿数: 115
お住まい・勤務地: 兵庫県
投稿日時: 2005-09-13 14:07
引用:
maruさんの書き込み (2005-09-13 13:59) より:
これを元に、VB.NET+SQLServerで使えるように改造してみます。



再帰処理は慣れで書けるようになるはずです。
(慣れないうちは無限ループに気をつけて下さい:P
お時間があるようでしたら、まずは、
単純な再帰処理で練習されることをお勧めします。
#サンプル挙げてるくせに、矛盾すること言ってますね、私

では、頑張ってください。ノシ

スキルアップ/キャリアアップ(JOB@IT)