SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

ANSI SQLを用いた階層型構造のリストラクチャリング

階層型XMLプロセッシング

出力されるリストラクチャリングビューの動的な変更

 今日使われている大部分のXML変換は静的なものであるため、最終的なXML構造に特定の値を含めるか除外させる場合には、そのための変更を事前に施しておかなくてはなりません。これに対してSQLベースの変換では静的なXMLフォーマッティング用の処理を必要としませんが、それは動的なSELECTリストを用いることで、図4に示したような単純かつ動的なデータアイテム出力の取り込みや除外が行えるためです。

図4 動的なリストラクチャリング: Custノードをクエリに選択させないことで当該ノードを削除させ、InvoiceおよびAddressノードのプロモーションを行わせる
図4 動的なリストラクチャリング: Custノードをクエリに選択させないことで当該ノードを削除させ、InvoiceおよびAddressノードのプロモーションを行わせる

 具体的な処理としては下記のようなSQLクエリを用いることになります。

   SELECT EmpID, DpndID, Invoice, Address 
   FROM Transform

 このクエリについてはSELECTにてCustノードを取り込んでいない点に注意してください。これによりCustノードが排除され、その位置にInvoiceおよびAddrノードがプロモーションされるという、変換済み構造に対してのさらなる変更が施されます。こうした動的なSELECTリストはクエリごとに変更でき、その際にTransformationビューに組み込む変換ロジックを修正する必要はありません。つまりこの方式を用いれば、操作性と柔軟性と再利用性を有す、非常に強力な動的変換が行えるのです。

レッグ順の変更とノードの複製

 次のサンプルでは(図5を参照)、図1に示したオリジナルのStoreViewデータ構造を基にして、各種の変換を施しています。図5におけるStoreViewビューを構成しているのは、CustViewEmpViewの2つのビューです。ここでの変換処理で行う作業は、各ノードを分離することでStoreViewからCustViewを抽出することです。その次に行うのはCustビューの再構成で、その際には結合(join)の実行順を変更することでAddrInvoiceのレッグ(leg)の順番を意図的に変更していますが、これが機能するのは、この構造が上から下および左から右の方向に構成されているためです。これがどのような変更となるかは、サンプルの構造図を比較することで確認してください。

図5 レッグ順の変更: この複数回の結合(join)を用いたクエリ処理では、StoreViewからのCustビューの抽出後その再構成を行い、AddressとInvoiceのレッグを入れ換えて、Addrの下にもう1つの追加ノードInvoiceを付加している
図5 レッグ順の変更: この複数回の結合(join)を用いたクエリ処理では、StoreViewからのCustビューの抽出後その再構成を行い、AddressとInvoiceのレッグを入れ換えて、Addrの下にもう1つの追加ノードInvoiceを付加している
   SELECT Cust.custid, Invoice.invid, Invoice.invcustid, Addr.addrid,
          Addr.addrcustid, invoice2.invid NewInv
   FROM Storeview Cust
   LEFT JOIN StoreView Addr ON Cust.custid=Addr.addrcustid
   LEFT JOIN StoreView Invoice ON Cust.custid=Invoice.invcustid
   LEFT JOIN StoreView Invoice2 ON Addr.addrcustid=Invoice2.invcustid

 EmpViewCustviewデータの組み合わせで生じる複製データは、出力データがXML化される際に自動的に取り除かれます。またこの変換では、追加ノードのInvoiceを選択して、図5におけるAddrノードの下に配置するようにしています。

 先に見たリストラクチャリングのサンプルでは、フラグメントを用いてデータの移動を行っていました。それに対してこのサンプルでは、ノードレベルでの処理を行っています。ノードレベル方式は詳細な制御を施せる反面、フラグメント方式は一般的に扱いが簡単であり、またノードレベルにはない重要な機能が利用できます。通常、1つのグループに属すノード群は最適化された構造にまとめられているケースが多く、再結合に使用可能な値(外部キーなど)が当該グループ中に残されていない場合があります。そうした際のソリューションとなるのがフラグメント方式であり、次のサンプルで見るようにこの方式では、移動対象を変化させることなく1つのグループとして操作できるのです。

次のページ
Below-the-Root方式のリンクによるリストラクチャリング

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Michael M. David(Michael M. David)

 Advanced Data Access Technologies, Incの創設者であり、それ以前はNCR/Teradataのスタッフ研究員および主任XML設計者として活動し、ANSI SQLX Groupの代表も務める。フラット、リレーショナル、階層型データを用いた非プロシージャ方式による異種データベ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3920 2009/06/04 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー