mb_language("uni"); mb_internal_encoding("utf-8"); mb_http_input("auto"); mb_http_output("utf-8"); ?>
NeoCoreサポートセンタを運営し、様々なご質問をいただき日々回答をさせていただいております。まだまだ新しい分野ということもあり、十分なサポートをご提供できていないのではと、精進を心がけています。
いただくご質問の中に「どのようにXMLを設計すればよいのか? スキーマレスとはいってもアプリケーションがどのようにXMLを使用するのかはあらかじめ設計する必要がある。」といったものを受け取ることがあります。
NeoCoreXMSはXMLであればすべてDBが受け入れますので、XMLの変更には非常に柔軟に対応することは可能ですが、根幹となるXMLデザインがどうなっているかは少なからず開発に影響を与えます。
ここでは、NeoCoreXMSの特性を踏まえて、どのようにXMLデザインするべきかを簡単な例をあげて一緒に考えさせていただきたいと思います。もちろん設計上や他の要件による制約もありますので、なにが一番よいデザインであるかを決めることは難しい問題です。少しでも皆様の開発の手助けになれば幸いです。
いまさら述べるまでもありませんが、RDBで開発してきたものをXML DBで開発するには以下のXMLが持つ特徴を生かしたいと考えられていると思います。
XMLを利用してデータモデルを記述すると、直感的なやり方で記述することができます。それは以下の点のような特徴を持つからです。
XMLを構成する以下の4つが組み合わさって表現されます。
商品情報を例に取って考えてみましょう。商品といってもいろいろなものが想定されますので、PCを例に取ってみます。まずは、PCの商品情報の構成要素を洗い出してみます。
これらをcomputerというタグで始まるXML設計をしてみましょう。
例1
これはすべてを1行でPCを表現しています。 また、HDやRAM、priceといったものには、単位と値が混在しています。
例2
<computer> <name>name01</name> <maker>maker01</maker> <CPU>Intel01</CPU> <HD>40</HD> <RAM>40</RAM> <os>Windows2000</os> <price>248000</price> </computer>
DB(NeoCoreXMS)にとってはどちらのXMLであっても格納可能ですし、検索にかかるコストもほとんど同じです。
それでは、PCの登録台数がどんどん増えていった場合を考えてみます。
検索にヒットするXML文書が増加すると、データの転送速度が増大します。そこで必要なデータのみを抽出することにしますが、例1では対象行が全て抽出されます。(検索結果から必要な属性の値のみ抽出することは可能です)
osがWindows2000のnameのみを抽出したいという場合には以下のように記述しますが、例2の方が効率的です。
【例1】/ND/computer[@os='Windows2000']/@name.text() 【例2】/ND/computer[os='Windows2000']/name
XML構造が複雑になればなるほど、このような状況が予想されます。例えば、HDだけでは何を意味するか分かりませんので「単位」を追加する。「回転数」「接続I/F」を追加するとしていきます。
ところがosがWindows2000のPC名を検索するにはこのHD関連の情報は不要なのです。不要なものを処理しようとすれば、その分処理に時間がかかってしまいます。
つまり、どのような処理(Query)を行うのかを、意識した設計が必要となります。また、実際のQueryの実行であっても、取得するデータ量が小さくなるようにすることを意識します。
次の例では、RDBのjoinの考え方をXMLでも行うことを考えてみます。
最初の例のPCの注文情報のデータを考えます。注文情報の情報としては以下のものがあります。
<order ordered="001"> <orderData>2004/07/27</orderDate> <orderInfo> <name>ネオコア 太郎</name> <addr>住所</addr> <tel>03-1234-5678</tel> <email>taro@neocore.jp</email> </orderInfo> <item> <PC>デスクトップPC1</PC> <単価>178000</単価> <個数>1</個数> </item> <item> <PC>ノートPC1</PC> <単価>228000</単価> <個数>1</個数> </item> </order>
注文者の詳細情報やPCの情報をどこまでこの注文情報の中に含めるかが、処理速度の面で差が出てきます。RDBでの開発でも同じですが正規化しすぎたデータは逆に処理効率を落としてしまいます。「注文情報」としたときに、必要な情報は1つのツリーやレコードに納まっている方が処理速度が高速になるのはご理解いただけると思います。
また、このようなログ型の情報ではマスタの変更を注文情報に反映するのではなく、そのトランザクションが発生した時点でのデータを保持しておきたいという要求も多くあります。
PCに商品IDを追加して、coumputerとorderでデータを管理しているXMLを設計してみます。
<computer ID="PC001"> <name>name01</name> <maker>maker01</maker> <CPU>Intel01</CPU> <HD>40</HD> <RAM>40</RAM> <os>Windows2000</os> <price>248000</price> </computer> <order ordered="001"> <orderData>2004/07/27</orderDate> <orderInfo> <name>ネオコア 太郎</name> <addr>住所</addr> <tel>03-1234-5678</tel> <email>taro@neocore.jp</email> </orderInfo> <item> <PC>PC001</PC> <個数>1</個数> </item> <item> <PC>PC002</PC> <個数>1</個数> </item> </order>
単価とPC名はcomputerノードより取得することにします。
for $order in (/ND/order) let $pcname in (/ND/computer[@ID=$order/item/PC]/name let $pcprice in (/ND/computer[@ID=$order/item/PC]/price return
--- 必要な形に整形します ---
こうすると注文情報の1item毎にcomputer内のマッチする情報を検索しなければなりません。
これまで見てきたサンプルのようにXMLを設計する上ではどのように処理を行うかといったイメージを持つことが非常に重要です。
NeoCoreXMSはスキーマレスのXML DBですからアプリケーションが使用するXMLがそのまま格納できますので、DBの制約を受けにくいといえます。
ただし、XMLの可読性を高める上では以下の手順も併せて実行されることを推奨します。(NeoCoreXMSの開発元 Xpriori社CTOのChris Brandinが「XML DataManagement」の第1章で述べていることの抜粋です。)
もし、今XMLをお持ちでしたら是非上記を頭に浮かべて見直してみてください。きっと読みやすく管理しやすいXMLの姿が見えてくるでしょう。
▲このページのTOPへ