ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

NoSQLにおける非正規化状態でのデータモデルの作り方を、XMLスキーマのデザインパターンから考える

2010-02-08 11:09:10 | そのほか

 RDBの正規化する場合の、データモデルの作り方は、手法として確立しているといえます。
 正規化して、ERモデルに落とし込むわけですけど、それについては、ここで書きました。

 じゃ、RDB以外のものに関しては?
 最近、NoSQLっていうんですか?それについての、データモデルはどう作るんでしょ。。。

 もちろん、NoSQL=RDB以外ということは、いろんなデータベースが考えられるわけで(KVSもそうだけど、ネットワーク型だろうが、階層型だろうが、XMLDBだろうが、オブジェクト指向DB・・・などなど)、いろんなデータベースがあるんだから、それに伴って、いろんなモデルがあることになりますよね。


 ということで、「このモデルだあ!」という決定的なモデルが出る・・??ってことはないと思いますけど、
 「NoSQLのこのDBにおいては、こーいうデータモデルの出し方も考えられるよね!」というのは、言えそうです。今回は、それを考えます。
 で、データベースに関しては、XMLデータベースを考えます。




 XMLのデータベースを考えるということは、XMLの定義をしないといけないわけで、
 それは、XMLスキーマになります。

 前に書いたように、XMLスキーマには、デザインパターンがあって、それは、

  1.ロシアンドール(ロシア人形)
  2.ガーデン・オブ・エデン
  3.サラミスライス
  4.ベネチアンブラインド

とあるわけですが、とくに、

サラミスライスは、要素(まあ、項目だよね)を全部あげて、グローバルにします。
ベネチアンブラインドは、型(まあ、クラスだよね)を挙げていき、
  要素は、ローカルに定義(隠蔽)されます。

要素=項目を全部あげて、グローバル=アクセス可能:共有化するっていう
  サラミスライスの考えは、
項目を全部挙げてテーブルにいれ、テーブルは基本的にアクセス可能、共有化する
  っていうRDBの発想に似ています。
RDB項目も、XMLにできるから、こーいう考えがあって当然なわけです。


一方

ベネチアンブラインドは、クラスごとに定義していき、要素は中に隠蔽できちゃいます。

 これは、

クラスを定義して、カプセル化することによって、データ隠蔽する

オブジェクト指向の考え方に似ています。




ということは、ベネチアンブラインドのような、クラス関係で表現するような形の
データモデルが存在しえるということです。

XMLやたぶん、KVSでも・・・

図は、ER図ではなく、クラス図で表現したほうがしやすいです。

クラス図って、ER図にできるんじゃないの・・?

たしかに・・・でも、表現はできるものの、操作的には、ER関係だと、めんどっちい
ことがあります。

たとえば、いつもの例で出している電波利用の例
ここに書いてあるように、送信機には、技術基準適合証明を受けた送信機と、そうでない無線機の2種類に分かれます。

 技適の無線機と、そうでない無線機では、項目が違うので、
   ER図では、
     送信機、
     技術基準適合機種、
     技術基準適合外機種
   と3種類のテーブルを持ち、外部キーでつながっています。

   クラス図で表すと、
     送信機の下に、
       技術基準適合機種、
       技術基準適合外機種
   の2つのクラスが継承されていることになります。

 なので、表現的には、結局3種類のものが出てくる・・・ことは違いません。

 ここで、Aさんが持っている送信機は、144Mhzが出力できるか?というのを検索したいとします。

 クラスのほうだと、送信機は、送信周波数を属性として持っているので、
   Aさんの送信機に対して、get送信周波数()して、144Mhzがあるか?確かめる必要があります。

 それに対して、ER図は、基本的には、集合演算操作であり、送信機の周波数を得るには、技術基準適合機種と、技術基準適合外機種の論理和をとって、そこから送信周波数の射影をとって、144Mhzを選択したとき、レコードがあるかどうかをしらべないといけません。
 ・・・ってだけでも大変なのですが、これではだめです。技術基準適合機種テーブルに、周波数はありません。
 さらに、それと「発射型式周波数等」をJoinして、・・・ってことになります。

 論理和を取るってことは、Unionをすることになります。つまり、Unionしたり、Joinしたりってことで、大変です(なので、普通このテーブルを設計するときは、正規化を崩します。崩していいことは、いつものシリーズの次あたりに書くことになります)。




 つまり、クラス表現をした場合、親側にとりたいフィールドがあれば、
   子供の構造とかを知らなくてもgetすれば値は取れるはずです。

 なので、

  ・すべての構造を知らなくてもいいし(技術基準適合という概念すら知らなくていい)、
  ・子供の構造は、親に値を返せる限りにおいて、いろいろ変更可能です
    (電波の型式によって、変調方法はかわるので、変調方式を発射型式にもって行っても、
     送信機の変調方式を検索している人には、影響は出ない)。

 それに対して、ER図で表現した場合、

  ・関係するすべての関係を知らないといけません。
    (技術基準適合も知らないとJoinできない)
  ・子供でも、テーブルを変えたら、大変なことになります。全部修正です

 ってことで、操作的には、違いが出てきます。




 設計的にも違います。

 要素をすべて出す必要があるRDBは、ボトムアップのほうがやりやすいはずです。

 トップダウンでも、ボトムまで下がって、全部の資料が出ないと、要素が決定できません。
 もし、全部の資料が出ないで、途中の資料をもとに、RDBを設計、プログラミングしてしまうと、
 残りの資料が出てきたとき、「あ、前のテーブル書き換えないと・・・」ってなったときに、
 それに関するテーブルのプログラムすべてに影響を与え、二度手間、三度手間、
 さらに、それに伴う混乱が生じます。

 なので、この手法を行う場合は、すべてのデータが出揃ってから、次の工程に入るという
 ウォーターフォールが向いています。


 一方、クラスでやるのなら、

 トップダウンで、段階的に詳細化していっても、親クラスのメソッドを呼び出している限り、
 詳細化した子クラスに変更があっても、適切な値を返せば、変更は吸収できることになります。

 なので、この手法を行う場合は、すべてのデータはそろう必要はなく、逐次開発できることになります。
 アジャイルが向いています。

 っていうことになります。




 このことを押さえていなかったから、電子政府は悲惨的な結果になっていくんだけど
(そして、まだまだ悲惨になる可能性を秘めているんだけど)
それについては、またこんど・・・

この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ARで売り場が変る!?とか、... | トップ | ”「Azure」正式スタート、Mic... »
最新の画像もっと見る

そのほか」カテゴリの最新記事