« バリデーションの双方向性問題を解く | トップページ | サロゲートキーは強制されるべきものではない »

2012.01.16

DBMSの方言を開発基盤で吸収する

 自作の開発基盤XEAD DriverはこれまでJavaの組込DB(Derby)専用だったのだが、要望の多かったMySQLとPostgreSQLにとりあえず対応した。MySQLについては比較的容易だったが、PostgreSQLには意外なところで手間取った。テーブル名やフィールド名に関する大文字・小文字の扱いがDerbyやMySQLとまるで違っていたからだ。

 たとえば、テーブル定義情報にもとづいて'CREATE TABLE ZT010 ...'を実行すると、テーブルモジュールが'zt010'で作成されてしまう。ゆえに、DBのメタデータを検索しても'ZT010'という定義上のテーブル名ではモジュールが見つからない。PostgreSQLは小文字がお気に入りのようで、メタデータ上のデータ型名までしっかり小文字だったりする。

 PostgreSQL上で大文字を含むテーブル名やフィールド名で作成したり操作したければ、SQL文上で'CREATE TABLE "ZT010" ...'のようにダブルクォーテーションで囲めばよい。ところがやっかいなことに、Derbyではダブルクォーテーション付きのSQLでもふつうに受け付けてくれるのだが、MySQLでは「SQLの構文がおかしい。"ZT010"なんて文字列が含まれている」と拒否されてしまう。

 いろいろ考えて次のように対処することにした。まず、DBMSによってダブルクォーテーションでSQLを調整するようなことはせず、PostgreSQLのメタデータ上のテーブル名やフィールド名を大文字に変換して、テーブル定義とマッピングするようにした。大文字・小文字混じりの名前を含むテーブルは扱えないことになってしまうが、まあ穏当なところだろう。

 SQLやデータ型についてDBMS毎の「方言」があることはよく知られているが、こういった基本的なレベルでも違いがあることを、私は寡聞にして知らなかった。今後ほかのDBMSに対応する際にも同様の話が出てくるかもしれない。

 げんなりするような話ではあるのだが、こういった苦労を開発基盤の開発者が引き受けるのは方向性としては正しい。開発基盤は異種DBを統合するためのハブとなるべきだからだ。そして、開発基盤がDBMS毎の差異を吸収することで、個別案件の開発プロジェクトが確実に楽になるからだ。

 今回の改善によって、XEAD Driverの新しいリリースでは複数の異種DB(注)に同時接続できるようになった。異なるDBにマスターが分散配置されているケースにも対応できる。「異種DBを統合するためのハブ」とはそういう意味で、使ってみると爽快このうえない。


注.ただし、分散トランザクションの困難を避けるために、更新用DBは1個のみで、他は読取専用とされる。厳しい制約に思われるかもしれないが、一般的な業務システムで複数DBにまたがる更新が必要になるとしたら、DB構成の基本プランを見直したほうがいい。

|

« バリデーションの双方向性問題を解く | トップページ | サロゲートキーは強制されるべきものではない »

コメント

XEAD Driverについての質問は、どうすればよいですか?
メールがいいのか、ここがいいのか分かりません。
以下、質問内容
XEAD Editorにおいて、公開されているソースをeclipseで実行した場合、
XEAD Driverプログラムに添付されているサンプルを読み込もうとすると
サンプルのバージョンが1.1でソースのバージョンが1.0だから読み込めないという意味のメッセージが出るのですが。
提供しているプログラムに対応するソースは公開されないのでしょうか?

投稿: 久保田 | 2012.02.05 17:04

久保田さま

GithubからDLされたソースのバージョンが古いためと思われます。最新版(1.1.0)で試していただけますか?やりとりの続きはDBCのサイトのメアドでお願いします(^^)

投稿: わたなべ | 2012.02.05 18:31

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: DBMSの方言を開発基盤で吸収する:

« バリデーションの双方向性問題を解く | トップページ | サロゲートキーは強制されるべきものではない »