Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

RDBを中核としたXMLDBの開発

1,006 views

Published on

RDBを中核としたXMLDBの開発

Published in: Technology
  • Be the first to comment

RDBを中核としたXMLDBの開発

  1. 1. RDBを中核とした XMLDBの開発 情報科学類 200711429 井上 寛之 アドバイザ教官:北川 博之, 天笠 俊之, 川島 英之Tuesday, January 15, 13
  2. 2. XMLとは 拡張可能なマークアップ言語 データや文書を論理的な構造として表現できる <筑波大学> <情報学群> <情報科学類> <学生 学籍番号= 200711429 > <名前>井上 寛之</名前> ......Tuesday, January 15, 13
  3. 3. XMLとは 筑波大学 情報学群 拡張可能なマークアップ言語 学生 情報科学類 井上 寛之 データや文書を論理的な構造として表現できる <筑波大学> <情報学群> <情報科学類> <学生 学籍番号= 200711429 > <名前>井上 寛之</名前> ......Tuesday, January 15, 13
  4. 4. データベースとは 特定のテーマに沿ったデータを集めて 管理し、容易に検索・抽出などの再利 用をできるようにしたもの from Wikipedia: データベースTuesday, January 15, 13
  5. 5. 関係データベース (Relational Database) 昨今「データベース」と言えば、「関係データベース」 関係モデルに従った厳密なテーブル設計 SQLによる問い合わせ 列名 データ型 Nullの許容 Id int FALSE Name nvarchar(100) TRUE Belong int TRUE SELECT Name FROM Person WHERE Belong = 3Tuesday, January 15, 13
  6. 6. XMLデータベース (XML Database) XML文書をそのままデータ構造として持つDB または、そのまま持っているように見えるDB 厳密なデータ構造を必要としない → 非常に柔軟 問い合わせ言語には「XPath」「XQuery」を用いる <?xml version="1.0" encoding="utf-8"?> <Persons> <Person id="0"> //Belong[@id= 3 ]/Name <Name>Hiroyuki Inoue</Name> <Belong id="3" /> </Person>Tuesday, January 15, 13
  7. 7. XMLデータベースの種類 ネイティブXMLデータベース XML文書をそのまま管理する リレーショナルXMLデータベース XML文書をそのまま管理しているように見えるだけ 実はXML文書をテーブル形式に変換し、RDBに格納Tuesday, January 15, 13
  8. 8. 目的 XMLDBがよくわからないTuesday, January 15, 13
  9. 9. 目的 XMLDBがよくわからない 作るのが手っ取り早いTuesday, January 15, 13
  10. 10. 作ったもの RDB SQL RecordTuesday, January 15, 13
  11. 11. 作ったもの XMLDB RDB SQL XPath Record XMLTuesday, January 15, 13
  12. 12. 作ったもの リ レ ー シ ョ ナ ル X M L デ ー タ ベ ース XML文書をそのまま管理しているように見えるXMLDB 1. XMLから関係テーブルへの出力 2. CSVファイルからRDBテーブルへの入力 3. XPathからSQLへの変換 4. 最終的なXML出力Tuesday, January 15, 13
  13. 13. 環境 Mac OS X 10.5(Mono) Emacs/Mono Develop(IDE) Windows Vista / XP(VMware Fusion) Visual Studio 2008(Visual C#) SQL Server 2005 Express Edition Transact-SQLTuesday, January 15, 13
  14. 14. 1.XMLから関係テーブルへの出力 SAX : Simple Api for Xml スタックを用いて効率的にXMLを処理する 文書の始まり/終わり , 要素の始まり/終わり , 属性 , テキスト などを見つけて、 イベント駆動的に処理をする → 省メモリで巨大なXMLを読む事ができるTuesday, January 15, 13
  15. 15. 1.XMLから関係テーブルへの出力 <?xml version="1.0" encoding="utf-8"?> <Persons> <Person id="0"> <Name>Hiroyuki Inoue</Name> <Belong id="3" /> </Person> <Person id="1"> <Name>いのうえ ひろゆき</Name> <Belong id="2" /> </Person> </Persons>Tuesday, January 15, 13
  16. 16. 1.XMLから関係テーブルへの出力 Persons Person id= 0 Person id= 1 Name Belong Name Belong 深さTuesday, January 15, 13
  17. 17. 1.XMLから関係テーブルへの出力 Persons Person id= 0 Person id= 1 Name Belong Name Belong 深さTuesday, January 15, 13
  18. 18. 1.XMLから関係テーブルへの出力通し番号、深さ、ノードタイプ、名前、値、ノード番号、パス 0,0,StartElement,Persons,null,1,/Persons 1,1,StartElement,Person,null,1.1,/Persons/Person 2,1,Attribute,id,0,1.1,/Persons/Person 3,2,StartElement,Name,null,1.1.1,/Persons/Person/Name 4,3,Text,null,Hiroyuki Inoue,1.1.1.1,/Persons/Person/Name 5,2,StartElement,Belong,null,1.1.2,/Persons/Person/Belong 6,1,Attribute,id,3,1.1.2,/Persons/Person 7,1,StartElement,Person,null,1.2,/Persons/Person 8,1,Attribute,id,1,1.2,/Persons/Person 9,2,StartElement,Name,null,1.2.1,/Persons/Person/Name 10,3,Text,null,いのうえ ひろゆき,1.2.1.1,/Persons/Person/Name 11,2,StartElement,Belong,null,1.2.2,/Persons/Person/Belong 12,1,Attribute,id,2,1.2.2,/Persons/PersonTuesday, January 15, 13
  19. 19. 1.XMLから関係テーブルへの出力通し番号、深さ、ノードタイプ、名前、値、ノード番号、パス 0,0,StartElement,Persons,null,1,/Persons 4,3,Text,null,Hiroyuki Inoue,1.1.1.1,/Persons/Person/Name 1,1,StartElement,Person,null,1.1,/Persons/Person 2,1,Attribute,id,0,1.1,/Persons/Personencoding="utf-8"?> <?xml version="1.0" 3,2,StartElement,Name,null,1.1.1,/Persons/Person/Name <Persons> 4,3,Text,null,Hiroyuki<Person id="0"> Inoue,1.1.1.1,/Persons/Person/Name 5,2,StartElement,Belong,null,1.1.2,/Persons/Person/Belong <Name>Hiroyuki Inoue</Name> 6,1,Attribute,id,3,1.1.2,/Persons/Person <Belong id="3" /> 7,1,StartElement,Person,null,1.2,/Persons/Person </Person> 8,1,Attribute,id,1,1.2,/Persons/Person <Person id="1"> 9,2,StartElement,Name,null,1.2.1,/Persons/Person/Name <Name>いのうえ ひろゆき</Name> 10,3,Text,null,いのうえ ひろゆき,1.2.1.1,/Persons/Person/Name <Belong id="2" /> 11,2,StartElement,Belong,null,1.2.2,/Persons/Person/Belong </Person> 12,1,Attribute,id,2,1.2.2,/Persons/Person </Persons>Tuesday, January 15, 13
  20. 20. 1.XMLから関係テーブルへの出力通し番号、深さ、ノードタイプ、名前、値、ノード番号、パス 0,0,StartElement,Persons,null,1,/Persons 4,3,Text,null,Hiroyuki Inoue,1.1.1.1,/Persons/Person/Name 8,1,Attribute,id,1,1.2,/Persons/Person 1,1,StartElement,Person,null,1.1,/Persons/Person 2,1,Attribute,id,0,1.1,/Persons/Personencoding="utf-8"?> <?xml version="1.0" <?xml version="1.0" encoding="utf-8"?> 3,2,StartElement,Name,null,1.1.1,/Persons/Person/Name <Persons> <Persons> 4,3,Text,null,Hiroyuki<Person id="0"> Inoue,1.1.1.1,/Persons/Person/Name <Person id="0"> 5,2,StartElement,Belong,null,1.1.2,/Persons/Person/Belong <Name>Hiroyuki Inoue</Name> <Name>Hiroyuki Inoue</Name> 6,1,Attribute,id,3,1.1.2,/Persons/Person <Belong id="3" /> <Belong id="3" /> 7,1,StartElement,Person,null,1.2,/Persons/Person </Person> </Person> 8,1,Attribute,id,1,1.2,/Persons/Person <Person id="1"> <Person id="1"> 9,2,StartElement,Name,null,1.2.1,/Persons/Person/Name <Name>いのうえ ひろゆき</Name> 10,3,Text,null,いのうえ ひろゆき,1.2.1.1,/Persons/Person/Name <Name>いのうえ ひろゆき</Name> <Belong id="2" /> 11,2,StartElement,Belong,null,1.2.2,/Persons/Person/Belong <Belong id="2" /> </Person> 12,1,Attribute,id,2,1.2.2,/Persons/Person </Person> </Persons> </Persons>Tuesday, January 15, 13
  21. 21. 2.CSVファイルからRDBテーブルへの入力 0,0,StartElement,Persons,null,1,/Persons 1,1,StartElement,Person,null,1.1,/Persons/Person 2,1,Attribute,id,0,1.1,/Persons/Person 3,2,StartElement,Name,null,1.1.1,/Persons/Person/Name 4,3,Text,null,Hiroyuki Inoue,1.1.1.1,/Persons/Person/Name 5,2,StartElement,Belong,null,1.1.2,/Persons/Person/Belong 6,1,Attribute,id,3,1.1.2,/Persons/Person 7,1,StartElement,Person,null,1.2,/Persons/Person 8,1,Attribute,id,1,1.2,/Persons/Person 9,2,StartElement,Name,null,1.2.1,/Persons/Person/Name 10,3,Text,null,いのうえ ひろゆき,1.2.1.1,/Persons/Person/Name 11,2,StartElement,Belong,null,1.2.2,/Persons/Person/Belong 12,1,Attribute,id,2,1.2.2,/Persons/PersonTuesday, January 15, 13
  22. 22. 3.XPathからSQLへの変換 Jay と呼ばれるパーサジェネレータを用いた が、使い方がよくわからないTuesday, January 15, 13
  23. 23. 3.XPathからSQLへの変換 Jay と呼ばれるパーサジェネレータを用いた が、使い方がよくわからない 結局自分で簡単なパーサーを書きましたTuesday, January 15, 13
  24. 24. 3.XPathからSQLへの変換 - 例1 //Belong 文章内のすべての「Belong」要素を取ってこい SELECT * FROM Table WHERE Path LIKE /%/Belong%Tuesday, January 15, 13
  25. 25. 3.XPathからSQLへの変換 - 例2 /Persons/Person[1] Persons要素の子要素の、1番目のPerson要素を取ってこい SELECT TOP(1) * FROM Table WHERE Path LIKE /Persons/Person%Tuesday, January 15, 13
  26. 26. DEMOTuesday, January 15, 13
  27. 27. 4.最終的なXML出力 実装が不十分 出力されるが正しいXMLではないTuesday, January 15, 13
  28. 28. まとめ コード量 4000行前後(GUI部分を除く) プロジェクトはオープンソースに http://www.codeplex.com/floridumTuesday, January 15, 13
  29. 29. まとめ これまであまり意識しなかった「巨大なXML文書」 を意識したコードを書く事ができた 1GByte級のXMLを変換する事も大丈夫! XML関連だけではなく、パーサ/パーサジェネレー タなどの知識も身に付いた しかし作り込みが甘いので、改善したいTuesday, January 15, 13

×