(57)【特許請求の範囲】
【請求項１】
コンピュータを、
第１のデータモデルで定義されるデータを構成するデータ項目に設定される情報が配列であることを示す第１の記号と一致する場合に、当該データ項目の種別を前記配列と判定し、前記配列であることを示す配列情報と前記配列の順番を示す順番情報とを結合した情報を、第２のデータモデルで項目名と値とを用いて定義されるデータの前記項目名に追加する第１の追加手段と、
前記データ項目に設定される情報がオブジェクトであることを示す、前記第１の記号とは異なる第２の記号を含む場合に、当該データ項目の種別を前記オブジェクトと判定し、前記オブジェクトであることを示すオブジェクト情報と前記データ項目に設定される情報である要素とを結合した情報を、前記項目名に追加する第２の追加手段と、
前記データ項目に設定される情報が値であることを示す、前記第１の記号および前記第２の記号とは異なる第３の記号を含む場合に、当該データ項目の種別を前記値と判定し、前記値を前記項目名に対応付けて、前記第２のデータモデルで定義されるデータを生成する第１の生成手段と
して機能させるためのデータモデル変換プログラム。
【請求項２】
前記コンピュータを
前記第２のデータモデルで定義されるデータベースに追加対象のデータが、新たな配列である場合には、前記配列情報と、前記データベースにおける末尾のデータであることを特定する順番情報とを結合して前記項目名を生成する第２の生成手段と、
前記オブジェクト情報と、前記追加対象のデータにおいてオブジェクトである要素とを結合した情報を前記項目名に追加する第３の追加手段と、
前記追加対象のデータにおける値と、前記項目名とを対応付けたデータを、前記第２のデータモデルで定義されるデータベースに、前記新たな配列として追加する第４の追加手段としてさらに機能させることを特徴とする請求項１に記載のデータモデル変換プログラム。
【請求項３】
前記コンピュータを
前記第２のデータモデルで定義されるデータベースに追加対象のデータが、既存の配列の新たな要素である場合には、前記配列情報と、前記既存の配列における末尾の要素であることを特定する順番情報とを結合した情報を、前記既存の配列を特定する項目名に追加する第５の追加手段と、
前記オブジェクト情報と、前記追加対象のデータにおいてオブジェクトである要素とを結合した情報を前記項目名に追加する第６の追加手段と、
前記追加対象のデータにおける値と、前記項目名とを対応付けたデータを、前記第２のデータモデルで定義されるデータベースに、前記既存の配列の新たな要素として追加する第７の追加手段としてさらに機能させることを特徴とする請求項１に記載のデータモデル変換プログラム。
【請求項４】
前記コンピュータを
前記第２のデータモデルで定義されるデータベースから削除対象のデータが、配列である場合に、当該配列を特定する前記配列情報と前記順番情報との組み合わせを、前記項目名として有するデータを前記データベースから特定する特定手段と、
特定した前記配列情報と前記順番情報との組み合わせを有する前記データを、前記データベースから削除する削除手段としてさらに機能させることを特徴とする請求項１に記載のデータモデル変換プログラム。
【請求項５】
第１の追加手段が、第１のデータモデルで定義されるデータを構成するデータ項目に設定される情報が配列であることを示す第１の記号と一致する場合に、当該データ項目の種別を前記配列と判定し、前記配列であることを示す配列情報と配列の順番を示す順番情報とを結合した情報を、第２のデータモデルで項目名と値とを用いて定義されるデータの前記項目名に追加し、
第２の追加手段が、前記データ項目に設定される情報がオブジェクトであることを示す、前記第１の記号とは異なる第２の記号を含む場合に、当該データ項目の種別を前記オブジェクトと判定し、前記オブジェクトであることを示すオブジェクト情報と前記データ項目に設定される情報である要素とを結合した情報を、前記項目名に追加し、
生成手段が、前記データ項目に設定される情報が値であることを示す、前記第１の記号および前記第２の記号とは異なる第３の記号を含む場合に、当該データ項目の種別を前記値と判定し、前記値を前記項目名に対応付けて、前記第２のデータモデルで定義されるデータを生成する
ことを特徴とするデータモデル変換方法。
【請求項６】
第１のデータモデルで定義されるデータを構成するデータ項目に設定される情報が配列であることを示す第１の記号と一致する場合に、当該データ項目の種別を前記配列と判定し、前記配列であることを示す配列情報と前記配列の順番を示す順番情報とを結合した情報を、第２のデータモデルで項目名と値とを用いて定義されるデータの前記項目名に追加する第１追加部と、
前記データ項目に設定される情報がオブジェクトであることを示す、前記第１の記号とは異なる第２の記号を含む場合に、当該データ項目の種別を前記オブジェクトと判定し、前記オブジェクトであることを示すオブジェクト情報と前記データ項目に設定される情報である要素とを結合した情報を、前記項目名に追加する第２追加部と、
前記データ項目に設定される情報が値であることを示す、前記第１の記号および前記第２の記号とは異なる第３の記号を含む場合に、当該データ項目の種別を前記値と判定し、前記値を前記項目名に対応付けて、前記第２のデータモデルで定義されるデータを生成する生成部と
を有することを特徴とするデータモデル変換装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データモデル変換プログラム、データモデル変換方法およびデータモデル変換装置に関する。
【背景技術】
【０００２】
近年、クラウドコンピューティングの普及に伴い、ＮｏＳＱＬと呼ばれる新たな種類のデータベースが広く利用されている。ＮｏＳＱＬは、リレーショナルデータベース管理システム（RDBMS：Relational  Database  Management  System）以外のデータベースであり、例えばキーバリュー型やドキュメント指向型などがある。
【０００３】
キーバリュー型には、キーに対して値を持つデータ構造や、キーに対してカラムを割当てたデータ構造がある。例えば、キーバリュー型のデータベースとしては、ＨＢａｓｅやＣａｓｓｎｄｒａなどがある。このＨＢａｓｅやＣａｓｓｎｄｒａでは、例えばルートにはフォルダ１つが生成できるなど、階層に制限のあるデータモデルが採用される。
【０００４】
ドキュメント指向型は、スキーマレスなデータ構造である。例えば、ドキュメント指向型のデータベースとしては、ＭｏｎｇｏＤＢやＣｏｕｃｈＤＢなどがある。これらのデータベースには、アプリケーション側が扱う複雑なデータをそのまま格納するデータモデルが採用される。このドキュメント指向型は、複雑なデータを扱うことから、多数のデータベースサーバにデータを分散させる場合に、データの管理や整合性の管理も複雑になる。最近のシステムは、大規模データの分散処理を実行することが多いので、階層に制限のあるデータモデルを採用したキーバリュー型のデータベースが利用される。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特表２０１０−５１９６２５号公報
【特許文献２】特開２０１１−８４５１号公報
【特許文献３】特開２０１０−２２４８２４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、従来技術では、アプリケーションの開発効率が悪いという問題がある。
【０００７】
例えば、階層に制限のあるデータモデルを用いてアプリケーションを開発する場合、最も深い階層にある各要素を別個の要素とする第１の手法と、データベース側が扱えない階層の要素を１つの要素とする第２の手法が利用される。
【０００８】
第１の手法を用いた場合、アプリケーション開発者が、キーの変換方式を検討することになる。つまり、アプリケーション側が扱うデータ構造と、データベース側で扱うデータ構造とが異なることから、アプリケーション側のデータとデータベース側のデータとを対応付けるキーを管理することになる。このため、扱う階層が異なる複数のアプリケーションを開発する場合には、アプリケーションごとにキーの変換方式を決定することになるので、開発工数が多くなる。
【０００９】
また、第２の手法を用いた場合、アプリケーションにおける検索処理は、１つにまとめられた複数の要素から該当要素を検索する処理になる。このため、アプリケーションが実行する検索処理が複雑なものになり、開発工数が多くなる。
【００１０】
１つの側面では、アプリケーションの開発効率を向上させることができるデータモデル変換プログラム、データモデル変換方法およびデータモデル変換装置を提供することを目的とする。
【課題を解決するための手段】
【００１１】
第１の案では、コンピュータに、第１のデータモデルで定義されるデータを構成するデータ項目の種別を判別する処理を実行させる。コンピュータに、前記データ項目の種別を配列と判別した場合に、配列であることを示す配列情報と配列の順番を示す順番情報とを結合した情報を、第２のデータモデルで項目名と値とを用いて定義されるデータの前記項目名に追加する処理を実行させる。コンピュータに、前記データ項目の種別をオブジェクトと判別した場合に、オブジェクトであることを示すオブジェクト情報と当該要素とを結合した情報を、前記項目名に追加する処理を実行させる。コンピュータに、前記データ項目の種別を値と判別した場合に、当該値を前記項目名に対応付けて、前記第２のデータモデルで定義されるデータを生成する処理を実行させる。
【発明の効果】
【００１２】
アプリケーションの開発効率を向上させることができる。
【図面の簡単な説明】
【００１３】
【図１】図１は、実施例１に係るシステムの全体構成例を示す図である。
【図２】図２は、実施例１に係るアプリサーバの構成を示す機能ブロック図である。
【図３】図３は、エンコード処理の流れを示すフローチャートである。
【図４】図４は、デコード処理の流れを示すフローチャートである。
【図５】図５は、アプリサーバ側が処理対象とするデータ構成例を示す図である。
【図６】図６は、データベースに格納されるデータ構成例を示す図である。
【図７】図７は、図５の状態から本文にデータを追加した場合のデータ構成例を示す図である。
【図８】図８は、本文が追加された後のデータベースに格納されるデータ構成例を示す図である。
【図９】図９は、図７の状態からコメントを追加した場合のデータ構成例を示す図である。
【図１０】図１０は、コメントが追加された後のデータベースに格納されるデータ構成例を示す図である。
【図１１】図１１は、ハードウェア構成例を示す図である。
【発明を実施するための形態】
【００１４】
以下に、本願の開示するデータモデル変換プログラム、データモデル変換方法およびデータモデル変換装置の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【実施例１】
【００１５】
［全体構成］
図１は、実施例１に係るシステムの全体構成例を示す図である。図１に示すように、このシステムは、アプリサーバ１０、アプリサーバ２０、データベースサーバ４０、データベースサーバ５０の各々が、ネットワークスイッチ３０を介して相互に接続されている。なお、図１に示した各サーバやネットワークスイッチの数はあくまで例示であり、これに限定されるものではない。
【００１６】
アプリサーバ１０とアプリサーバ２０は、アプリケーションを実行して、データベースサーバ４０やデータベースサーバ５０にデータを書き込んだり、データベースサーバ４０やデータベースサーバ５０からデータを読み出したりするアプリケーションサーバである。ここでは、アプリサーバ１０とアプリサーバ２０で実行されるアプリケーションは、階層に制限のないデータモデル（以下、階層データモデルと記載する場合がある）を処理対象とするものとする。
【００１７】
データベースサーバ４０やデータベースサーバ５０は、アプリサーバ１０やアプリサーバ２０が使用するデータを格納するデータベースである。ここでは、各データベースサーバは、例えばＫＶＳ（Key−Value  Store）など、階層に制限のあるデータモデル（以下、非階層データモデルと記載する場合がある）でデータを格納するものとする。
【００１８】
ネットワークスイッチ３０は、各装置間の通信を中継する中継装置であり、例えば、レイヤ２スイッチ、レイヤ３スイッチ、ルータ、ゲートウェイなどが該当する。
【００１９】
このような状態において、各アプリケーションサーバは、データモデル変換エンジンを用いて、アプリケーションで使用するデータモデルを機械的に変換して、各データベースサーバに格納する。
【００２０】
アプリサーバ１０が有するデータモデル変換エンジン１０ａを例にして説明する。データモデル変換エンジン１０ａは、アプリケーションサーバが使用する階層データモデルで定義されたデータ項目の種別を判別する。そして、データモデル変換エンジン１０ａは、データ項目の種別を配列と判別した場合に、配列であることを示す情報と配列の順番を示す情報とから、データベースサーバ４０で使用されている非階層データモデルで定義される項目名を生成する。また、データモデル変換エンジン１０ａは、データ項目の種別をオブジェクトと判別した場合に、オブジェクトであることを示す情報と当該データとから、項目名を生成する。そして、データモデル変換エンジン１０ａは、データ項目の種別を値と判別した場合に、当該値を生成された項目名に対応付けて、非階層データモデルで定義されるデータを生成する。
【００２１】
このように、データモデル変換エンジン１０ａは、階層構造で定義されるデータをＫＶＳなどの階層構造を持たないデータベースに格納する際に、データが配列かオブジェクトか値かによって変換ルールを変更してデータ変換することができる。この結果、データモデルの機械的な変換を実行することができ、アプリケーションの開発効率を向上させることができる。
【００２２】
［アプリサーバの構成］
次に、図１に示したアプリサーバについて説明する。図１に示したアプリサーバ１０とアプリサーバ２０とは同様の構成を有するので、ここでは、アプリサーバ１０を例にして説明する。また、図１に示した各データベースサーバは、一般的なデータベースサーバと同様の構成を有するので、詳細な説明は省略する。
【００２３】
図２は、実施例１に係るアプリサーバの構成を示す機能ブロック図である。図２に示すように、アプリサーバ１０は、アプリケーション１１とデータベース接続部１２と変換部１３とを有する。各処理部は、ＣＰＵ（Central  Processing  Unit）などが実行する処理部である。なお、変換部１３は、図１に示したデータモデル変換エンジン１０ａに対応する。
【００２４】
アプリケーション１１は、各種処理を実行して、データベースサーバ４０にデータを格納する。また、アプリケーション１１は、各種処理を実行して、データベースサーバ４０からデータを読み出す。
【００２５】
データベース接続部１２は、各データベースサーバとアプリサーバ１０との間に通信を制御する処理部である。例えば、データベース接続部１２は、変換部１３から入力されたデータおよびデータ格納指示を、データベースサーバ４０に出力する。また、データベース接続部１２は、データベースサーバ４０から入力されたデータを、変換部１３に出力する。
【００２６】
変換部１３は、エンコード処理部１４とデコード処理部１５と追加処理部１６と削除処理部１７とを有し、これらによってデータモデルの変換を実行する処理部である。すなわち、変換部１３は、アプリケーションが使用する階層データモデルで定義されたデータをデータベースサーバに格納する際に、データベースサーバが使用する非階層データモデルに対応するデータに機械的に変換する。また、変換部１３は、データベースサーバが使用する非階層データモデルで定義されたデータをアプリケーションに出力する際に、アプリケーションが使用する階層データモデルに対応するデータに機械的に変換する。
【００２７】
エンコード処理部１４は、判別部１４ａと配列処理部１４ｂとオブジェクト処理部１４ｃと値処理部１４ｄと出力部１４ｅとを有し、階層データモデルから非階層データモデルに変換する処理部である。また、エンコード処理部１４は、データ変換処理を実行する際の初期化処理として、接頭語言い換えるとアプリケーションのデータモデル上のキーを「」と決定する。
【００２８】
判別部１４ａは、アプリケーションが使用するデータモデルで定義された各データ項目の種別を判別する処理部である。具体的には、判別部１４ａは、データ項目が配列かオブジェクトか値かを判別する。そして、判別部１４ａは、データ項目を配列と判別した場合には、当該データ項目を配列処理部１４ｂに出力する。また、判別部１４ａは、データ項目をオブジェクトと判別した場合には、当該データ項目をオブジェクト処理部１４ｃに出力する。また、判別部１４ａは、データ項目を値と判別した場合には、当該データ項目を値処理部１４ｄに出力する。
【００２９】
配列処理部１４ｂは、配列と判別されたデータ項目を、非階層データモデルで表現できる形式に変換する処理部である。具体的には、配列処理部１４ｂは、配列に対応した変換ルールにしたがってデータ変換を実行する。そして、配列処理部１４ｂは、データ変換後のデータ項目を出力部１４ｅに出力する。
【００３０】
例えば、配列処理部１４ｂは、判別部１４ａから入力されたデータ項目について、配列であることを示す情報と配列の順番を示す情報とから、非階層データモデルで定義される項目名を生成する。一例を挙げると、配列処理部１４ｂは、データ項目が配列を示す“［”であった場合、配列を示す“＿”と配列に割り振った連番“０”とを用いて、“［”を“＿０”に変換する。このとき、“［”が変換元データベースの先頭である場合、配列処理部１４ｂは、「」に続けた項目名、すなわち、「＿０」を生成する。
【００３１】
オブジェクト処理部１４ｃは、オブジェクトと判別されたデータ項目を、非階層データモデルで表現される形式に変換する処理部である。具体的には、オブジェクト処理部１４ｃは、オブジェクトに対応した変換ルールにしたがってデータ変換を実行する。そして、オブジェクト処理部１４ｃは、データ変換後のデータ項目を出力部１４ｅに出力する。
【００３２】
例えば、オブジェクト処理部１４ｃは、判別部１４ａから入力されたデータ項目について、オブジェクトであることを示す情報と当該データ項目そのものとから、非階層データモデルで定義される項目名を生成する。一例を挙げると、オブジェクト処理部１４ｃは、データがオブジェクト“ｉｄ”であった場合、オブジェクトを示す“．”とデータそのもの“ｉｄ”とを用いて、“ｉｄ”を“．ｉｄ”に変換する。つまり、オブジェクト処理部１４ｃは、データベース側で表現できない階層で定義されているデータを、“．”で結合して１つの項目名を生成する。このとき、“ｉｄ”が変換元データベースの先頭である場合、オブジェクト処理部１４ｃは、「」に項目名を追加し、「．ｉｄ」を生成する。
【００３３】
値処理部１４ｄは、値と判別されたデータ項目を、非階層データモデルで表現される形式に変換する処理部である。具体的には、値処理部１４ｄは、値に対応した変換ルールにしたがってデータ変換を実行する。そして、値処理部１４ｄは、データ変換後のデータ項目を出力部１４ｅに出力する。例えば、値処理部１４ｄは、判別部１４ａから入力されたデータ項目について、当該値を項目名に対応付けて、非階層データモデルで定義されるデータを生成する。
【００３４】
一例として、データが“：０”であり、“：０”が値処理部１４ｄに入力されるまでに生成されたデータ項目が“＿０．ｉｄ”である場合を例にして説明する。この場合、値処理部１４ｄは、“＿０．ｉｄ”に“：０”を対応付ける。つまり、値処理部１４ｄは、「“＿０．ｉｄ”：０」を生成する。ここで生成されたデータは、キーとＶａｌｕｅの関係になっている。上記例の場合、「“＿０．ｉｄ”」がキーで、「：０」がＶａｌｕｅとなる。すなわち、値処理部１４ｄは、自身が入力を受け付けるまでに配列処理部１４ｂやオブジェクト処理部１４ｃで生成された項目をキー、自身に入力されたデータをＶａｌｕｅとしたデータを生成する。
【００３５】
出力部１４ｅは、配列処理部１４ｂ、オブジェクト処理部１４ｃ、値処理部１４ｄの各々が生成したデータを、データベース接続部１２を介してデータベースサーバ４０に出力する処理部である。例えば、出力部１４ｅは、配列処理部１４ｂから入力された“＿０”を、データベース接続部１２を介してデータベースサーバ４０に出力する。
【００３６】
デコード処理部１５は、判別部１５ａとキー解析部１５ｂと配列処理部１５ｃとオブジェクト処理部１５ｄと出力部１５ｅとを有し、非階層データモデルから階層データモデルに変換する処理部である。
【００３７】
判別部１５ａは、データベースサーバで使用されるデータモデルで定義された各データの種別を判別する処理部である。具体的には、判別部１５ａは、データベースサーバから要素１つを読み出す。そして、判別部１５ａは、読み出した要素をキー解析部１５ｂに出力する。その後、判別部１５ａは、キー解析部１５ｂから入力されたデータについて、配列、オブジェクトのいずれかを判別する。その後、判別部１５ａは、配列として判別したデータを配列処理部１５ｃに出力する。また、判別部１５ａは、オブジェクトと判別したデータをオブジェクト処理部１５ｄに出力する。
【００３８】
一例を挙げると、判別部１５ａは、データベースサーバから要素として「“＿０．ｉｄ”：０」を読み出す。そして、判別部１５ａは、この要素「“＿０．ｉｄ”：０」をキー解析部１５ｂに出力する。その後、判別部１５ａは、キー解析部１５ｂから「」が除かれた「“＿０．ｉｄ”：０」を受け付ける。そして、判別部１５ａは、「＿０」、「．ｉｄ」、「：０」各々が配列かオブジェクトかそれ以外かを順番に判別する。
【００３９】
この場合、はじめに、判別部１５ａは、「＿０」を０番目の配列すなわち最初の配列と判別して、配列処理部１５ｃに出力する。次に、判別部１５ａは、「．ｉｄ」を最初の配列の要素となるオブジェクトと判別して、オブジェクト処理部１５ｄに出力する。最後に、判別部１５ａは、「：０」を最初の配列の値と判別して、オブジェクト処理部１５ｄに出力する。
【００４０】
キー解析部１５ｂは、判別部１５ａから入力された要素からキーを削除する処理部である。具体的には、キー解析部１５ｂは、判別部１５ａから入力された要素から、エンコード処理部１４で定義されたキーを削除する。そして、キー解析部１５ｂは、要素から空文字（キー）を削除したデータを判別部１５ａに出力する。
【００４１】
配列処理部１５ｃは、データベースサーバの非階層データモデルで配列として管理されるデータを、アプリケーションが階層データモデルとして扱う配列に変換する処理部である。具体的には、配列処理部１５ｃは、判別部１５ａから入力されたデータから、配列を生成する。例えば、配列処理部１５ｃは、判別部１５ａから「＿０」が入力された場合、アプリケーションが扱う階層データモデル上で、０番目の配列すなわち最初の配列を生成する。そして、配列処理部１５ｃは、生成した配列を出力部１５ｅに出力する。
【００４２】
オブジェクト処理部１５ｄは、データベースサーバの非階層データモデルでオブジェクトとして管理されるデータを、アプリケーションが階層データモデルとして扱うオブジェクトに変換する処理部である。具体的には、オブジェクト処理部１５ｄは、判別部１５ａから入力されたデータから、オブジェクトを生成する。
【００４３】
例えば、オブジェクト処理部１５ｄは、判別部１５ａから「＿０」の後に続く「．ｉｄ」が入力された場合、アプリケーションが扱う階層データモデル上で、最初の配列のオブジェクト「ｉｄ」を生成する。そして、オブジェクト処理部１５ｄは、生成したオブジェクトを出力部１５ｅに出力する。また、オブジェクト処理部１５ｄは、判別部１５ａから「＿０」の後の「．ｉｄ」の後に続く「：０」が入力された場合、アプリケーションが扱う階層データモデル上で、最初の配列のオブジェクト「ｉｄ」の値「０」を生成する。そして、オブジェクト処理部１５ｄは、生成したオブジェクトを出力部１５ｅに出力する。
【００４４】
追加処理部１６は、データベースサーバ４０に格納されたデータベースにデータを追加する処理部である。具体的には、追加処理部１６は、エンコード処理部１４によってデータモデルが変換されたデータベースにデータを追加する。例えば、追加処理部１６は、追加対象のデータが新たな配列の場合には、データベースの末尾に記憶される配列を特定する番号をインクリメントした新たな番号を用いて、当該データベースの末尾に項目名を追加する。そして、追加処理部１６は、追加した項目名にオブジェクトを追加し、値を対応付けて、データベースに追加対象のデータを追加する。
【００４５】
また、追加処理部１６は、追加対象のデータが既存配列の新たな要素の場合には、当該配列の番号、ならびに、当該配列の末尾の要素に割り振られた番号を特定する。そして、追加処理部１６は、特定した配列の番号と、当該要素の番号をインクリメントした番号とを結合した項目名を、データベースにおける既存配列の末尾に追加する。そして、追加処理部１６は、追加した項目名にオブジェクトを追加し、値を対応付けて、データベースに追加対象のデータを追加する。
【００４６】
削除処理部１７は、データベースサーバ４０に格納されたデータベースからデータを削除する処理部である。具体的には、削除処理部１７は、エンコード処理部１４によってデータモデルが変換されたデータベースからデータを削除する。例えば、削除処理部１７は、削除対象のデータが配列である場合に、当該配列を特定する情報と配列の順番との組み合わせから構成される項目名をデータベースから特定する。そして、削除処理部１７は、特定した項目名に該当するデータを、データベースから削除する。
【００４７】
［処理の流れ］
次に、アプリサーバ１０が実行するエンコード処理とデコード処理の各々について説明する。
【００４８】
（エンコード処理）
図３は、エンコード処理の流れを示すフローチャートである。図３に示すように、エンコード処理部１４は、エンコード処理を開始すると、初期化処理として接頭語を空文字と決定する（Ｓ１０１）。
【００４９】
続いて、判別部１４ａは、エンコード対象のデータベースからデータ項目を読み込み（Ｓ１０２）、当該データ項目が配列の開始または配列の次の要素の開始であるか否かを判定する（Ｓ１０３）。
【００５０】
そして、配列処理部１４ｂは、判別部１４ａによってデータ項目が配列の開始または配列の次の要素の開始であると判定された場合（Ｓ１０３Ｙｅｓ）、配列を表す記号と要素の番号とを接頭語の末尾に追加する（Ｓ１０４）。例えば、配列処理部１４ｂは、「接頭語＋記号＋番号」として「＿０」などを生成する。
【００５１】
その後、エンコード処理部１４は、エンコード対象のデータベースに未変換のデータ項目が存在すると判定した場合（Ｓ１０５Ｙｅｓ）、Ｓ１０２以降を繰り返す。一方、エンコード処理部１４は、エンコード対象のデータベースに未変換のデータが存在しないと判定した場合（Ｓ１０５Ｎｏ）、エンコード処理を終了する。
【００５２】
また、Ｓ１０３において、判別部１４ａは、データが配列の開始または配列の次の要素の開始ではないと判定した場合（Ｓ１０３Ｎｏ）、当該データ項目がオブジェクトのキーか否かを判定する（Ｓ１０６）。
【００５３】
そして、オブジェクト処理部１４ｃは、判別部１４ａによってデータ項目がオブジェクトのキーと判定された場合（Ｓ１０６Ｙｅｓ）、オブジェクトを表す記号とキーとを接頭語の末尾に追加する（Ｓ１０７）。その後、エンコード処理部１４は、Ｓ１０５を実行する。例えば、オブジェクト処理部１４ｃは、「接頭語＋記号＋キー」を生成する。
【００５４】
一方、オブジェクト処理部１４ｃは、判別部１４ａによってデータ項目がオブジェクトのキーではないと判定された場合、つまり、当該データ項目が値と判定された場合（Ｓ１０６Ｎｏ）、接頭語をキー、値を値とするデータをデータベースサーバに出力する（Ｓ１０８）。Ｓ１０８の後は、Ｓ１０５の処理が実行される。
【００５５】
（デコード処理）
図４は、デコード処理の流れを示すフローチャートである。図４に示すように、デコード処理部１５は、デコード処理を開始すると、次の要素を読み込む（Ｓ２０１）。なお、処理開始時には、デコード処理部１５によってデコード対象の先頭データが読み込まれる。例えば、デコード処理部１５の判別部１５ａは、「“＿０．ｉｄ”：０」などのように、１レコードを読み込む。
【００５６】
続いて、キー解析部１５ｂは、判別部１５ａが読み出した要素「“＿０．ｉｄ”：０」から、エンコード処理部１４がキーとして扱う「」を削除して、当該キーの続くデータを読み込む（Ｓ２０２）。
【００５７】
そして、配列処理部１５ｂは、読み込んだデータが判別部１５ａによって配列の要素と判定された場合（Ｓ２０３Ｙｅｓ）、配列を生成して要素を追加する（Ｓ２０４）。その後、Ｓ２０２以降の処理が繰り返される。例えば、配列処理部１５ｂは、当該データが初めの配列の始まりであれば、アプリケーションが利用するデータベース内に、新たな配列を生成する。配列処理部１５ｂは、２番目の配列の始まりであれば、アプリケーションが利用するデータベース内に、２番目の配列を生成する。また、配列処理部１５ｂは、既に生成済みの配列要素かつ配列の始まりであれば、アプリケーションが利用するデータベース内に既に生成済みの配列の要素として新たな配列を生成する。
【００５８】
一方、オブジェクト処理部１５ｄは、読み込んだデータが判別部１５ａによって配列の要素ではなく（Ｓ２０３Ｎｏ）、オブジェクトであると判定された場合（Ｓ２０５Ｙｅｓ）、オブジェクトを生成する（Ｓ２０６）。その後、Ｓ２０２以降の処理が繰り返される。例えば、判別部１５ａは、読み込んだデータがオブジェクトであれば、アプリケーションが利用するデータベースのオブジェクトを生成する。
【００５９】
また、判別部１５ａは、読み込んだデータを配列の要素でもなく（Ｓ２０３Ｎｏ）、オブジェクトでもないと判定した場合（Ｓ２０５Ｎｏ）、変換対象のデータをオブジェクトまたは配列の値として追加する（Ｓ２０７）。例えば、判別部１５ａは、アプリケーションが利用するデータベース内に既に生成されている配列やオブジェクトの要素に当該値を用いる。
【００６０】
その後、判別部１５ａは、デコード対象のデータベースに未処理の要素が存在する場合（Ｓ２０８Ｙｅｓ）、Ｓ２０１に戻って、次の要素について以降の処理を繰り返す。一方、判別部１５ａは、デコード対象のデータベースに未処理の要素が存在しない場合（Ｓ２０８Ｎｏ）、デコード処理を終了する。
【００６１】
［具体例］
次に、図５と図６とを用いて、図３で説明したエンコード処理と図４で説明したデコード処理の各々について、具体例を説明する。図５は、アプリサーバ側が処理対象とするデータ構成例を示す図である。図６は、データベースに格納されるデータ構成例を示す図である。
【００６２】
ここでは、一例として、ＪＳＯＮ形式でデータの受け渡しを行うものとするが、これに限定されるものではなく、構造化された形式であればよい。また、実際には、４から５階層のデータモデルを扱うのが一般的ではあるが、ここでは、説明上、１階層を例にして説明する。また、ここでは、ブログ記事にコメント等が追加されているデータベースの例について説明する。
【００６３】
（エンコードの具体例）
図５から図６を生成する具体例を説明する。まず、判別部１４ａは、図５に示したデータベースから先頭の“［”を読み込む。続いて、判別部１４ａは、読み込んだ“［”を配列の始まりと判定する。すると、配列処理部１４ｂは、当該“［”が初めの配列であることから、「接頭語＋記号＋連番」として「＿０」などを生成する。
【００６４】
続いて、判別部１４ａは、図５に示したデータベースから「｛”ｉｄ“」を読み込み、「｛」があることから配列の要素と判別し、さらに「”ｉｄ“」をオブジェクトと判定する。つまり、判別部１４ａは、読み込んだ「｛”ｉｄ“」を、コメントオブジェクトと判別する。
【００６５】
すると、オブジェクト処理部１４ｃは、「接頭語＋記号＋キー」として「．ｉｄ」などを生成するが、すでに接頭語に「＿０」が追加されていることから、「“＿０．ｉｄ”」を生成することになる。
【００６６】
続いて、判別部１４ａは、図５に示したデータベースから「：０」を読み込み、「：０」が配列でもオブジェクトでもないことから、「：０」を値と判別する。すると、オブジェクト処理部１４ｃは、「“＿０．ｉｄ”」がすでに生成されていることから、これに「：０」を対応付けて、「“＿０．ｉｄ”：０」を生成する。つまり、オブジェクト処理部１４ｃは、「“＿０．ｉｄ”」をキー、「：０」を値としたＫＶＳ形式のデータを生成する。
【００６７】
続いて、判別部１４ａは、図５に示したデータベースから「，」を読み込み、これが改行を示す情報であることから、次のデータについて上述した処理と同様の処理を実行する。
【００６８】
このように、エンコード処理部１４は、配列を示す“［”から“］”まで配列として処理し、“｛”から“｝まで同階層として処理する。すなわち、エンコード処理部１４は、「ｉｄ」、「ｔｉｔｌｅ」、「ｂｏｄｙ」、「ｔａｇｓ」、「ａｕｔｈｏｒ」、「ｃｏｍｍｅｎｔｓ」を同じ階層として扱うことから、いずれのデータについても接頭語として「＿０」を追加する。
【００６９】
ここで、別例として、図５に示した「“ｔａｇｓ”：［“タグ１”，“タグ２”］」について説明する。このデータは、オブジェクト“ｔａｇｓ”の値が配列であることを示している。このため、エンコード処理部１４は、“タグ１”と“タグ２”を区別するために、連番を付加する。つまり、エンコード処理部１４は、“タグ１”を０番目、“タグ２”を１番目と区別する。この結果、エンコード処理部１４は、「“ｔａｇｓ”：［“タグ１”，“タグ２”］」を、「“＿０．ｔａｇｓ＿０”：タグ１」と「“＿０．ｔａｇｓ＿１”：タグ２」とに変換する。
【００７０】
また、同種のデータとして「“ｃｏｍｍｅｎｔｓ”：［｛〜｝，｛〜｝］」について説明する。このデータも、オブジェクト“ｃｏｍｍｅｎｔｓ”の値が配列であることを示している。さらに、このデータは、各要素が複数のデータで構成されている。つまり、「｛｝」の中に存在するデータは、同階層として処理される。具体的には、１つの「｛｝」の中に存在する「ｉｄ、ａｕｔｈｏｒ、ｔｅｘｔ」が同じ階層と扱われ、２つの「｛｝」の中に存在する「ｉｄ、ａｕｔｈｏｒ、ｔｅｘｔ」が同じ階層と扱われる。また、各要素には、連番が付加される。この結果、エンコード処理部１４は、はじめの「｛〜｝」を０番目の配列、次の「｛〜｝」を１番目の配列として処理する。
【００７１】
具体的には、エンコード処理部１４は、「“ｃｏｍｍｅｎｔｓ”：［｛」を、「“＿０．ｃｏｍｍｅｎｔｓ＿０”」と変換する。そして、エンコード処理部１４は、「“ｃｏｍｍｅｎｔｓ”：［｛」に続く「“ｉｄ”：１００」については、「“＿０．ｃｏｍｍｅｎｔｓ＿０．ｉｄ：１００”」と変換する。同様に、エンコード処理部１４は、「“ｃｏｍｍｅｎｔｓ”：［｛」に続く「“ａｕｔｈｏｒ”：ユーザ２」については、「“＿０．ｃｏｍｍｅｎｔｓ＿０．ａｕｔｈｏｒ：ユーザ２”」と変換する。同様に、エンコード処理部１４は、「“ｃｏｍｍｅｎｔｓ”：［｛」に続く「“ｔｅｘｔ”：コメント１」については、「“＿０．ｃｏｍｍｅｎｔｓ＿０．ｔｅｘｔ：コメント１”」と変換する。
【００７２】
さらに、エンコード処理部１４は、「“ｃｏｍｍｅｎｔｓ”：［｛」の後に続く「｛」については、「“＿０．ｃｏｍｍｅｎｔｓ＿１”」と変換する。そして、エンコード処理部１４は、２個目の「｛」に続く「“ｉｄ”：１０１」については、「“＿０．ｃｏｍｍｅｎｔｓ＿１．ｉｄ：１０１”」と変換する。同様に、エンコード処理部１４は、２個目の「｛」に続く「“ａｕｔｈｏｒ”：ユーザ１」については、「“＿０．ｃｏｍｍｅｎｔｓ＿１．ａｕｔｈｏｒ：ユーザ１”」と変換する。同様に、エンコード処理部１４は、２個目の「｛」に続く「“ｔｅｘｔ”：コメント２」については、「“＿０．ｃｏｍｍｅｎｔｓ＿１．ｔｅｘｔ：コメント２”と変換する。なお、他のデータについては上述した処理と同様の処理を実行するので、詳細な説明は省略する。
【００７３】
（デコードの具体例）
ここでは、図６から図５を生成する具体例を説明する。まず、判別部１５ａは、図６に示したデータベースから先頭の「｛  ”＿０．ｉｄ“：０」を読み込む。続いて、キー解析部１５ｂは、要素「“＿０．ｉｄ”：０」の先頭に位置する「」を削除して、「」に続く「“＿０．ｉｄ”：０」を読み込む。
【００７４】
続いて、判別部１５ａは、読み込んだデータ「“＿０．ｉｄ”：０」から、キーの始まりを示す「“」からオブジェクトを示す記号である「．」の前までの「＿０」を抽出する。そして、判別部１５ａは、「＿」が配列を示す記号であり、「０」が配列に割り与えられた連番であることから、「＿０」を始めの配列の開始と判別する。すると、配列処理部１５ｃは、配列の開始かつデータベースの開始であることから、アプリケーションに対応するデータベースの先頭としてデータ“［”を生成する。さらに、配列処理部１５ｃは、生成したデータ“［”の後には配列の要素が続くことから、データ“［”に続けて、データ“｛”を生成する。この時点では、「［  ｛  」が生成される。
【００７５】
その後、判別部１５ａは、読み込んだデータ「“＿０．ｉｄ”：０」から、読み出し済みの要素からキーの終わりを示す「”」までの「．ｉｄ」を抽出する。そして、判別部１５ａは、「．」がオブジェクトを示す記号であり、「ｉｄ」がオブジェクトであることから、「．ｉｄ」をオブジェクトであると判別する。すると、オブジェクト処理部１５ｄは、オブジェクトとして「ｉｄ」を生成する。このとき、オブジェクト処理部１５ｄは、配列処理部１５ｃによって配列が生成されている場合には、当該オブジェクト「ｉｄ」を配列の要素とする。この時点では、「［  ｛  “ｉｄ”」が生成される。
【００７６】
さらに、判別部１５ａは、次に続く要素が「：０」である場合、当該データに配列を示す記号もオブジェクトを示す記号も含まれていないことから、当該データを「値」と判定する。したがって、判別部１５ａは、「：０」を「ｉｄ」の値する。この結果、「［  ｛  “ｉｄ”：ｉｄ」が生成される。
【００７７】
次に、処理対象のデータとして「“＿０．ｔａｇｓ＿０”：“タグ１”」を読み出した例について説明する。この場合、デコード処理部１５は、「“＿０．ｔａｇｓ”」に対して、上述した処理と同様、「配列０番目のオブジェクトがｔａｇｓ」であると判定する。さらに、デコード処理部１５は、ｔａｇｓの後に配列を示す「＿」と配列に割り振った連番「０」が存在することから、「オブジェクトであるｔａｇｓが、配列の０番目の要素としてタグ１を有する」と判定する。この結果、デコード処理部１５は、「“＿０．ｔａｇｓ＿０”：“タグ１”」を「“ｔａｇｓ”：［“タグ１”］」と変換する。
【００７８】
また、この処理対象のデータとして「“＿０．ｔａｇｓ＿０”：“タグ１”」には、さらに続いて「“＿０．ｔａｇｓ＿１”：“タグ２”」が存在する。そして、デコード処理部１５は、「“＿０．ｔａｇｓ  ”」に対して、上述した処理と同様、「配列０番目のオブジェクトがｔａｇｓ」であると判定する。さらに、デコード処理部１５は、ｔａｇｓの後に配列を示す「＿」と配列に割り振った連番「１」が存在することから、「オブジェクトであるｔａｇｓが、配列の１番目要素としてタグ２を有する」と判定する。この結果、デコード処理部１５は、「“＿０．ｔａｇｓ＿０”：“タグ２”」を変換する際には、「“ｔａｇｓ”：［“タグ１”］」に要素を追加する形となり、「“ｔａｇｓ”：［“タグ１”、“タグ２”］」と変換する。
【００７９】
続いて、処理対象のデータとして「“＿０．ｃｏｍｍｎｅｔｓ＿０．ｉｄ”：１００」を読み出した例について説明する。この場合、デコード処理部１５は、「“＿０．ｃｏｍｍｎｅｔｓ”」に対して、上述した処理と同様、「配列０番目のオブジェクトがｃｏｍｍｎｅｔｓ」であると判定する。さらに、デコード処理部１５は、ｃｏｍｍｎｅｔｓの後に、配列を示す「＿」と、配列に割り振った連番「０」と、オブジェクトであることを示す「．ｉｄ」とが存在することを検出する。
【００８０】
このため、デコード処理部１５は、「“＿０．ｃｏｍｍｎｅｔｓ＿０．ｉｄ”」に対して、「オブジェクトであるｃｏｍｍｎｅｔｓが、配列の０番目の要素としてオブジェクトである「ｉｄ」を有する」と判定する。さらに、デコード処理部１５は、「“＿０．ｃｏｍｍｎｅｔｓ＿０．ｉｄ”」の後に「：１００」が続くことから、オブジェクトである「ｉｄ」の値が「１００」であると判定する。この結果、デコード処理部１５は、「“＿０．ｃｏｍｍｎｅｔｓ＿０．ｉｄ”：１００」を「“ｃｏｍｍｎｅｔｓ”：［  ｛  ”ｉｄ“：１００」と変換する。
【００８１】
なお、デコード処理部１５は、「“＿０．ｃｏｍｍｎｅｔｓ＿０．ａｕｔｈｏｒ”：ユーザ２」については、「オブジェクトであるｃｏｍｍｎｅｔｓが、配列の０番目の要素としてオブジェクトである「ａｕｔｈｏｒ」を有すると判定する。さらに、デコード処理部１５は、オブジェクトである「ａｕｔｈｏｒ」の値が「ユーザ２」であると判定する。したがって、デコード処理部１５は、「“＿０．ｃｏｍｍｎｅｔｓ＿０．ａｕｔｈｏｒ”：ユーザ２」を「“ｃｏｍｍｎｅｔｓ”：［  ｛  “  ａｕｔｈｏｒ”：ユーザ２」と変換する。ただし、ｃｏｍｍｎｅｔｓが有する配列は、「ｉｄ」に対応するデータを変換した既に生成されている。このため、デコード処理部１５は、「“＿０．ｃｏｍｍｎｅｔｓ＿０．ａｕｔｈｏｒ”：ユーザ２」を「“ａｕｔｈｏｒ”：ユーザ２」と、最終的に変換する。なお、他のデータについては上述した処理と同様の処理を実行するので、詳細な説明は省略する。
【００８２】
［効果］
このように、実施例１に係る変換部１３は、アプリケーションが処理対象とする階層構造のデータをデータベースサーバが処理対象とするＫＶＳに格納する際に、データが配列かオブジェクトか値かによって変換ルールを変更してデータ変換することができる。
【００８３】
また、実施例１に係る変換部１３は、データベースサーバが処理対象とするＫＶＳを、アプリケーションサーバが処理対照とする階層構造のデータに変換する際に、データが配列かオブジェクトか値かによって変換ルールを変更してデータ変換することができる。このように、実施例１に係る変換部１３は、アプリケーションサーバとデータベースサーバとで処理対象となるデータモデルが異なる場合でも、データモデルの変換を機械的に実行することができる。
【００８４】
したがって、データベースサーバが処理対象とするデータモデルを意識することなく、アプリケーションを開発することができる。この結果、実施例１に係る変換部１３は、データモデルの機械的な変換を可能にし、アプリケーションの開発効率を向上させることができる。
【実施例２】
【００８５】
実施例１では、アプリケーションが使用するデータモデルをデータベースサーバが使用するデータモデルに変換する例とその逆について説明したが、これに限定されるものではなく、データの追加や削除等についても実行することができる。そこで、実施例２では、アプリケーションがデータベースサーバのデータモデルを意識することなく、データベースサーバのデータモデルにデータを追加する例と、データベースサーバのデータモデルからデータを削除する例とについて説明する。
【００８６】
［追加例１（最後尾）］
ここでは、図５に示したデータ構造の最後尾にデータを追加して図７に示したデータ構造を生成する例について説明する。図７は、図５の状態から本文にデータを追加した場合のデータ構成例を示す図である。図８は、本文が追加された後のデータベースに格納されるデータ構成例を示す図である。つまり、ここでは、アプリケーション側では図７に示したデータ構造になるようにデータを追加することで、データベースサーバ側では図６に示した状態からデータを追加して図８に示したデータ構造を生成する例について説明する。
【００８７】
例えば、アプリケーション１１は、追加処理部１６に対して、ＡＰＩ（Application  Program  Interface）として「ａｐｐｅｎｄ（＜データ内容＞）；」を実行する。データ内容には以下の文字列が格納される。
【００８８】
｛
“ｉｄ”          ：  １，
“ｔｉｔｌｅ”    ：  “タイトル２”，
“ｂｏｄｙ”      ：  “本文２”，
“ａｕｔｈｏｒ”  ：  “ユーザ２”，
｝
【００８９】
具体的には、追加処理部１６は、追加対象のデータ項目の先頭が「｛」であることから、配列の要素の開始であると認識する。すると、追加処理部１６は、図６に示したデータベースから配列を示す「＿」で始まり、これに続く数字の最も大きい文字列を検索する。すなわち、追加処理部１６は、図６に示したデータを先頭から検索していき、最後の行が「“＿０．ｃｏｍｍｅｎｔｓ＿１．ｔｅｘｔ”：“コメント２”，」であると認識する。そして、追加処理部１６は、「＿」で始まり、これに続く最も大きな数字が「０」であると特定する。
【００９０】
すると、追加処理部１６は、得られた数字に１を加えたものを採番する。すなわち、追加処理部１６は、すでに記憶されている「０」番目の配列の次の配列として、上記データ項目各々をデータベースに格納するために、「１」を採番する。
【００９１】
その後、追加処理部１６は、実施例１のフローチャート等で説明した変換ルールにしたがって、採番された番号をもとに項目名を生成する。具体的には、追加処理部１６は、格納対象のデータがオブジェクトの項目名であった場合には「＿１」に「．」および項目名を追加したデータ項目を生成する。また、追加処理部１６は、格納対象のデータが配列であった場合には「＿１」に「＿」を追加したデータ項目を生成する。また、追加処理部１６は、格納対象のデータが値であった場合には、当該値をすでに生成されているデータ項目の値として、キー＋バリューを生成する。
【００９２】
例えば、「“ｉｄ”：１，」の場合、追加処理部１６は、“ｉｄ”がオブジェクトであると判定し、「＿１」に「．」および項目名を追加して、「＿１．ｉｄ」を生成する。続いて、追加処理部１６は、「：１，」を読み込み、これを値と判定して、データ項目「＿１．ｉｄ」の値とする。すなわち、追加処理部１６は、「“＿１．ｉｄ”：１」を生成する。
【００９３】
上述した処理を、追加対象のデータ各々について再帰的に繰り返すことで、図８に示すように、新たな配列の要素としてデータを追加することができる。すなわち、２件目のブログ記事を追加することができる。
【００９４】
［データ参照］
次に、アプリサーバ１０で実行されるアプリケーションが、データベースサーバ４０に記憶されるデータを参照する例を説明する。例えば、アプリケーション１１は、変換部１３に対して、ＡＰＩとして「ｇｅｔｌｉｓｔ（）；」を実行する。
【００９５】
続いて、変換部１３は、図８に示したデータベースから、「＿」ではじまり、「＿」に続く数字の最も大きいものを検索する。図８の例では、変換部１３は、「＿１＿ａｕｔｈｏｒ」を検出する。
【００９６】
そして、変換部１３は、「＿１．」ではじまる項目名を取得し、取得した項目それぞれについて「＿」に数字が追加されたものであれば配列に変換し、「．」であればオブジェクトに変換する。この結果、変換部１３は、以下の文字列をアプリケーションに返答する。
【００９７】
｛
“ｉｄ”          ：  １，
“ｔｉｔｌｅ”    ：  “タイトル２”，
“ｂｏｄｙ”      ：  “本文２”，
“ａｕｔｈｏｒ”  ：  “ユーザ２”，
｝
【００９８】
［追加例２（途中）］
ここでは、図７に示したデータ構造の途中にデータを追加して図９に示したデータ構造を生成する例について説明する。図９は、図７の状態からコメントを追加した場合のデータ構成例を示す図である。図１０は、コメントが追加された後のデータベースに格納されるデータ構成例を示す図である。つまり、ここでは、アプリケーション側では図９に示したデータ構造になるようにデータを追加し、データベースサーバ側では図８に示した状態からデータを追加して図１０に示したデータ構造を生成する例について説明する。
【００９９】
例えば、アプリケーション１１は、追加処理部１６に対して、ＡＰＩとして「ａｐｐｅｎｄ（＜追加対象＞，＜データ内容＞）；」を実行する。追加対象には、ｇｅｔＦｉｒｓｔ（）．ｃｏｍｍｅｎｔｓが指定され、データ内容には以下の文字列が格納される。
【０１００】
｛
“ｉｄ”          ：  １０２，
“ａｕｔｈｏｒ”  ：  “ユーザ２”，
“ｔｅｘｔ”      ：  “コメント３”，
｝
【０１０１】
具体的には、追加処理部１６は、追加対象を空文字とする。続いて、追加処理部１６は、配列の先頭要素を表す「ｇｅｔＦｉｒｓｔ（）」の場合、追加対象に「＿０」を追加する。すなわち、追加対象は、「＿０」となる。また、追加処理部１６は、オブジェクトの項目名であった場合、追加対象に「．」を追加したデータ項目を生成する。すなわち、追加対象は、「“＿０．ｃｏｍｍｅｎｔｓ”」となる。
【０１０２】
そして、追加処理部１６は、配列にデータを追加する。具体的には、追加処理部１６は、図８に示したデータベースから追加対象に続いて「＿」で始まり、それに続く数字の最も大きいものを検索する。すなわち、追加処理部１６は、図８に示したデータを先頭から検索していき、追加対象である「“＿０．ｃｏｍｍｅｎｔｓ”」に続く数字のうち最も大きい数字の最終行が「“＿０．ｃｏｍｍｅｎｔｓ＿１．ｔｅｘｔ”：“コメント２”，」であると認識する。そして、追加処理部１６は、追加対象に続いて「＿」で始まり、それに続く数字の最も大きな数字が「１」であると特定する。その後、追加処理部１６は、得られた数字「１」に１を加算した「２」を採番する。すなわち、追加対象は、「“＿０．ｃｏｍｍｅｎｔｓ＿２”」となる。
【０１０３】
その後、追加処理部１６は、採番された番号をもとに項目名を生成する。具体的には、追加処理部１６は、追加対象のデータがオブジェクトの項目名であった場合、「＿１」に「．」を追加したデータ項目を生成する。また、追加処理部１６は、追加対象のデータが配列であった場合、「＿１」に「＿」を追加したものに連番を追加する。また、追加処理部１６は、格納対象のデータが値であった場合には、当該値をすでに生成されているデータ項目の値として、キー＋バリューを生成する。
【０１０４】
例えば、「“ｉｄ”：１０２，」の場合、追加処理部１６は、“ｉｄ”がオブジェクトであると判定し、「＿２」に「．」および項目名を追加して、「＿０．ｃｏｍｍｅｎｔｓ＿２．ｉｄ」を生成する。続いて、追加処理部１６は、「：１０２，」を読み込み、これを値と判定して、データ項目「＿０．ｃｏｍｍｅｎｔｓ＿２．ｉｄ」の値とする。すなわち、追加処理部１６は、「“＿０．ｃｏｍｍｅｎｔｓ＿２．ｉｄ”：１０２」を生成する。
【０１０５】
上述した処理を、追加対象のデータ各々について再帰的に繰り返すことで、図１０に示すように、既に格納されているコメントの新たな配列の要素として、データを追加することができる。すなわち、１件目のブログ記事にコメントを追加することができる。
【０１０６】
［削除例］
ここでは、図１０に示したデータ構造からデータを削除する例について説明する。一例として、２件目のブログ記事を削除する例について説明する。つまり、アプリケーション側がデータベースサーバのデータモデルを意識することなく、アプリケーションの操作によってデータベースサーバからデータを削除する例について説明する。
【０１０７】
アプリケーション１１は、削除処理部１７に対して、ＡＰＩとして「ｄｅｌｅｔｅ（＜削除対象＞）；」を実行する。削除対象には、ｇｅｔＦｉｒｓｔ（）．ｎｅｘｔが指定される。
【０１０８】
削除処理部１７は、削除対象を空文字とする。続いて、削除処理部１７は、配列の先頭要素を表す「ｇｅｔＦｉｒｓｔ（）」の場合、削除対象に「＿０」を追加する。すなわち、削除対象は、「＿０」となる。続いて、削除処理部１７は、配列の次の要素を表す「ｎｅｘｔ（）」の場合、削除対象の最後の「＿」以降の数字を１増分したものに置き換える。すなわち、削除対象は、「＿１」となる。その後、削除処理部１７は、削除対象ではじまるものを全て削除する。すなわち、削除処理部１７は、「＿１」ではじまるデータを全て削除する。具体的には、以下のデータが削除される。
【０１０９】
｛
“＿１．ｉｄ”          ：  １，
“＿１．ｔｉｔｌｅ”    ：  “タイトル２”，
“＿１．ｂｏｄｙ”      ：  “本文２”，
“＿１．ａｕｔｈｏｒ”  ：  “ユーザ２”，
｝
【０１１０】
上述した処理を行うことで、データモデルが異なるサーバ間であっても、任意のデータ項目を削除することができる。このため、データベースへのデータ追加やデータ削除を、データモデルの影響を受けることなく、任意に実行することができる。
【実施例３】
【０１１１】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に異なる実施例を説明する。
【０１１２】
（データ構造）
上記実施例で説明したデータ構造はあくまで一例であり、実施例で説明したデータ構造に限定されない。例えば、実施例では、１階層を例にしたが、２階層以上でも同様に処理することができる。また、実施例では、ＪＳＯＮ形式でデータの受け渡しを実行する例について説明したが、これに限定されるものではなく、ＸＭＬ（Extensible  Markup  Language）など他の形式であってもよい。
【０１１３】
（変換エンジン）
上記実施例では、アプリサーバが変換部を有する例について説明したが、これに限定されるものではなく、例えば、データベースサーバが変換部を有していてもよく。また、アプリサーバやデータベースサーバとは別の筐体で、データモデル変換処理を実行する変換部を有するサーバ装置を実現してもよい。
【０１１４】
（変換ルール）
上記実施例では、配列については「＿」、オブジェクトについては「．」を用いて、データを結合する例を説明したが、これに限定されるものではなく、「＃」や「＄」など他の記号を用いてもよい。また、順番情報として０からインクリメントしていく例を説明したが、これに限定されるものではなく、例えば１００からデクリメントしてもよく、順番を特定できる手法であれば、任意の手法を用いることができる。
【０１１５】
（システム）
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともできる。あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１１６】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られない。つまり、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１１７】
（ハードウェア構成）
ところで、上記の実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータシステムで実行することによって実現することができる。そこで、以下では、上記の実施例と同様の機能を有するプログラムを実行するコンピュータの一例を説明する。
【０１１８】
図１１は、ハードウェア構成例を示す図である。図１１に示すように、アプリサーバ１００は、ＣＰＵ１０２、入力装置１０３、出力装置１０４、通信インタフェース１０５、媒体読取装置１０６、ＨＤＤ（Hard  Disk  Drive）１０７、ＲＡＭ（Random  Access  Memory）１０８を有する。また、図１１に示した各部は、バス１０１で相互に接続される。
【０１１９】
入力装置１０３は、マウスやキーボードであり、出力装置１０４は、ディスプレイなどであり、通信インタフェース１０５は、ＮＩＣ（Network  Interface  Card）などのインタフェースである。ＨＤＤ１０７は、図２等に示した機能を実行するプログラムやデータ等を記憶する。記録媒体の例としてＨＤＤ１０７を例に挙げたが、ＲＯＭ（Read  Only  Memory）、ＲＡＭ、ＣＤ−ＲＯＭ等の他のコンピュータが読み取り可能な記録媒体に各種プログラムを格納しておき、コンピュータに読み取らせることとしてもよい。なお、記録媒体を遠隔地に配置し、コンピュータが、その記憶媒体にアクセスすることでプログラムを取得して利用してもよい。また、その際、取得したプログラムをそのＷＡＮ高速化装置自身の記録媒体に格納して用いてもよい。
【０１２０】
ＣＰＵ１０２は、図２に示した各処理部と同様の処理を実行するプログラムを読み出してＲＡＭ１０８に展開することで、図２等で説明した各機能を実行するプロセスを動作させる。すなわち、このプロセスは、アプリケーション１１、データベース接続部１２、変換部１３と同様の機能を実行する。このようにアプリサーバ１００は、プログラムを読み出して実行することでデータモデル変換方法を実行する情報処理装置として動作する。
【０１２１】
また、アプリサーバ１００は、媒体読取装置１０６によって記録媒体から上記プログラムを読み出し、読み出された上記プログラムを実行することで上記した実施例と同様の機能を実現することもできる。なお、この他の実施例でいうプログラムは、アプリサーバ１００によって実行されることに限定されるものではない。例えば、他のコンピュータまたはサーバがプログラムを実行する場合や、これらが協働してプログラムを実行するような場合にも、本発明を同様に適用することができる。
【符号の説明】
【０１２２】
１０  アプリサーバ
１１  アプリケーション
１２  データベース接続部
１３  変換部
１４  エンコード処理部
１４ａ  判別部
１４ｂ  配列処理部
１４ｃ  オブジェクト処理部
１４ｄ  値処理部
１４ｅ  出力部
１５  デコード処理部
１５ａ  判別部
１５ｂ  キー解析部
１５ｃ  配列処理部
１５ｄ  オブジェクト処理部
１５ｅ  出力部
【図１】
0005867208.tif 000002
【図２】
0005867208.tif 000003
【図３】
0005867208.tif 000004
【図４】
0005867208.tif 000005
【図５】
0005867208.tif 000006
【図６】
0005867208.tif 000007
【図７】
0005867208.tif 000008
【図８】
0005867208.tif 000009
【図９】
0005867208.tif 000010
【図１０】
0005867208.tif 000011
【図１１】
0005867208.tif 000012