mysqlでの複数DBの扱いについて

2,660 views
Skip to first unread message

NAKA

unread,
Apr 14, 2010, 3:19:00 PM4/14/10
to DBFluteユーザの集い
初投稿させて頂きます。NAKAといいます。
大変素晴らしいO/Rマッパだと思い、ぜひ利用したいと思ったのですが
自動生成の部分でいきなりハマっておりますので、質問させて下さい。

◆やりたいこと
(1) mysqlで、同一サーバ、同一ユーザにて、複数のデータベースを扱いたい
(2) ConditionBeanにて「データベース名.テーブル名」の修飾形式でSQLが発行されるようにしたい
(3) ConditionBeanにて、データベースをまたいだFK制約を扱いたい

複数DBについては、複数のDBFluteクライアントを作る方法が紹介されていますが
その方法では、(1)は解決しても(2)以降が実現できないように思います。
上記のような構成は、できないのでしょうか?
(なお、実際にアプリで使用する際には、1つのデータソースとして扱うつもりです)

自分は、mysqlは長年触ってきたものの、Javaフレームワークは初級レベルです。
mysqlでは、テーブル名をデータベース名で修飾することで、同一サーバ上の複数のデータベースを
一個のクエリで操作できるという利点?があります。
しかしながら、Javaの(jdbcの)世界では、これがどうも引っかかることが多いのです。
以前、ibatisの自動生成ツールibatorも試した事があるのですが、同じような問題で引っかかって
仕方なくibatorのソースを書き換えたこともあります。

恥ずかしながら今までmysqlしか使ってこなかったので、他ベンダのことはよく知らないのですが、
複数DBって、けっこう普通に使いませんかね?
例えば、郵便番号テーブルなど汎用性の高い物は DbCommon というデータベースに置き、
顧客住所テーブルを DbCustomer に置いてFK制約付けるとか、そういう構成がごく普通だと
思っていたのですが、私が根本的に間違っているのでしょうか・・・?

質問なのか愚痴なのか判らなくなって申し訳ありませんが、
ご教授頂ければ幸いです。

kubo

unread,
Apr 15, 2010, 1:26:08 AM4/15/10
to dbf...@googlegroups.com
jfluteです。

NAKAさん、こんにちは

まずは、複数DBについて
個人的な分析ですが。

まず、一つ目。
汎用性の高い物は DbCommon に置いて、
顧客住所テーブルを DbCustomer に置いて、
という構成ですが、複数のアプリケーションで
DbCommon を再利用して利用することが想定される
場合は、そのようにすることが多いと思います。
(開発会社も管理も全然違う別システムが再利用する場合)
逆に、アプリは結局一つ、もしくは、密接度の高い複数の
アプリでしか扱わない場合は、一つのデータベース(スキーマ)
にまとめることが多いと思います。
ニュアンスとしては、本当に分割の必要性がある場合にのみ、
分割するという感じです。なぜかというと、やはりSQLは
どうしても複雑になるため、ConditionBeanみたいなツールは
工夫次第でどうにでもなりますが、結局、外だしSQLや
ツールから発行するSQLなどでテーブル名の修飾名が必要です。
(分割しないで済むならしない、ということが多いかと)
NAKAさんの構成は、どちらに相当するでしょうか?


そして、「本当に分割の必要性がある」ということを前提に
複数DBと複数スキーマについての想定を簡単にまとめてみると:

<複数DB>
別のシステムのデータベースを参照・更新するような場合。
自データベースとのFKよる関連性はあまり持つことは少ない。

<複数スキーマ>
別のスキーマのデータベースを参照・更新するような場合。
自データベースとのFKよる関連性を持つこともある。

という想定をしています。
DBFluteでは、複数スキーマを一つの自動生成環境で
取り扱う機能を持っています。
http://d.hatena.ne.jp/jflute/20081015/1224074336
複数DBの場合は、上記の想定から、あまり一つの自動生成環境で
取り扱う必要がないと想定されるため、作業の優先度の問題もあり、
複数の自動生成環境を作成することでの実現としています。

NAKAさんの構成の場合は、実は後者の複数スキーマに
相当すると思われますが、MySQLはスキーマという概念が
存在しないことから来るギャップになるかと思います。
PostgreSQL, Oracle, DB2, SQLServer は、スキーマをサポート
しています。(まあ、Oracleは逆にスキーマしかないですが)

そして、完全に個人的な経験則ですが、権限管理などで
どうしても分割したいような(堅めの)システムの場合は、
大抵、そもそもOracleを利用していることが多いですね。
MySQLはやはりシンプルDB(が特徴)なので、そもそも
そういった構成を求める場面が少ない気がします。
安価なOSSのDBでどうにかしたい、という場合でそれなり
のことをやる場合はPostgreSQLを利用している例が多いかと。


ということで、DBFluteとしても
「早くMySQLがスキーマをサポートしないかなぁ」
と思っているところですが、残念ながらその気配は
ない感じですね。(そもそもシンプルさを売りにした
DBなので、それを期待するのも間違ってるのかも)
とはいえ、データベースにもお値段がありますから、
「この構成だからこのDB使おう」と器用に対応できる
わけもなく、MySQLに関してはちょっと悩みの種です。
実際に、色々考えたことはあるのですが、実現が難しく、
上記の想定(実際の要望の有無)から、優先度を下げていました。

NAKAさんの環境での現状の回避ですが、
 o PostgreSQLを利用する
 o 分割する必要がないなら分割しない
というところになります。
いずれにせよ、DBFluteでももう一度考えてはみようかとは思います。
(additionalSchemaの機能を拡張して実現できるようにならないか)


#
# MySQLは、無名のスキーマを持ってるという扱いにして、
# additionalSchemaで、データベース名を指定できるように
# することでMySQLでも利用できるようにできないか...
#

2010/4/15 NAKA <nak...@ca2.so-net.ne.jp>:

> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
> このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
> このグループから退会するには、dbflute+u...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/dbflute?hl=ja からこのグループにアクセスしてください。
>
>

kubo

unread,
Apr 15, 2010, 4:01:57 PM4/15/10
to dbf...@googlegroups.com
jfluteです。

そもそもの分割ポリシーについての
議論を一旦置いておいて、
DBFluteのadditionalSchema機能で、
別データベースのスキーマを指定できるようにしました。
MySQLだと、別データベースの匿名スキーマを指定します。
dbflute-mysql-exampleを参考にして下さい。
(FKの関連を持つExampleではありませんが)

nextexampledb.$$NoNameSchema$$ = map:{
...
}

DBFluteモジュール 0.9.6.8-SNAPSHOT
DBFluteランタイム 0.9.6.8-01-SNAPSHOT

※モジュールはEMecha経由でダウンロードできます。


2010/4/15 kubo <dbf...@gmail.com>:

NAKA

unread,
Apr 15, 2010, 4:29:40 PM4/15/10
to DBFluteユーザの集い
jfluteさん、レスありがとうございます。

> NAKAさんの構成の場合は、実は後者の複数スキーマに
> 相当すると思われますが、MySQLはスキーマという概念が
> 存在しないことから来るギャップになるかと思います。

まさにその通りです。実はスキーマという概念も最近知ったので
うまく言い表せなかったのですが、適切な表現ありがとうございます。

>安価なOSSのDBでどうにかしたい、という場合でそれなり
>のことをやる場合はPostgreSQLを利用している例が多いかと。

そうなんですよねぇ。
MySQLは、4.1になって(悪名高き)日本語問題が生じたときに
「もうPostgreSQLに乗り換えちゃる!」と何度思ったか判らないです。
私が始めた頃は、DBはMySQLで決まり!みたいな雰囲気があったものですから
なんら疑うことなくMySQLを選択したのですが、その後PostgreSQLは大きく進化を遂げて
pgpool2なんかすごく良さそうですね。

ただ、本棚にズラリと並んだMySQL本に目をやると、クエリ最適化やらレプリケーションやら
実運用でのノウハウを簡単には捨てられないという思いもありまして・・・複雑な心境です。
今までさんざん手を焼かされた彼女と、いざ別れるとなると寂しさを感じるというか、
そういう心情に近いといいますか・・・変な例え話ですみません。
ああ、my.cnfとにらめっこした日々・・・(笑)

> NAKAさんの環境での現状の回避ですが、
>  o PostgreSQLを利用する
>  o 分割する必要がないなら分割しない
> というところになります。

PostgreSQLには非常に魅力を感じるのですが、ちょっと年齢的にもパワーがありませんので
とりあえず「分割しない」という方向で考えたいと思います。

> いずれにせよ、DBFluteでももう一度考えてはみようかとは思います。
> (additionalSchemaの機能を拡張して実現できるようにならないか)

ご検討頂けましたら嬉しい限りです。
同じ名前のテーブルが複数存在してはいけないとか、そういう制約付きでも構いません。
よろしくお願いします。

もともとの原因は、MySQLの独自仕様というか、特殊性に起因する問題であって
DBFluteには何ら不備は無いと思っています。

お付き合い頂いてありがとうございました。
またご質問させて頂くこともあると思いますので、その際にはよろしくお願いします。


NAKA

unread,
Apr 15, 2010, 4:33:24 PM4/15/10
to DBFluteユーザの集い

すみません。行き違いになってしまったようですね。

jfluteさん、ありがとうございます。感激です!
さっそくDLさせて頂きます。

kubo

unread,
Apr 15, 2010, 7:16:32 PM4/15/10
to dbf...@googlegroups.com
jfluteです。

> MySQLは、4.1になって(悪名高き)日本語問題が生じたときに
自分は5.0からしかMySQLに触れてないので
あまり良く知らないのですが、大変だったみたいですねぇ。

> クエリ最適化やらレプリケーションやら
なんだかんだ言って、インフラ的な良い機能が
たくさんありますよね。
MySQLの諸々の騒動(買われて買われて)は、
一体どういう方向に進むのかやはり気になりますね。

> 同じ名前のテーブルが複数存在してはいけないとか、
> そういう制約付きでも構いません。
あっ、もともとDBFluteにはそういう制約があります。
厳密に頑張れば対応できなくはないと思われますが、
業務的にも紛らわしいので、テーブル名でユニーク
というシンプルな構成ですすめて行きたいと。
(VIEWやシノニムで代替できるので)

> さっそくDLさせて頂きます。
よろしくお願いします。
こちらでも、随時Example環境で
確認もしていきますので。

#
# ちなみに、additionalSchemaで、
# FKの関連性を持ったExampleは、
# dbflute-oracle-exampleになります。
# (ReplaceSchemaも含めて)
#

kubo

unread,
Apr 18, 2010, 12:11:38 PM4/18/10
to dbf...@googlegroups.com
jfluteです。

NAKAさん
利用しやすいように、DBFlute-0.9.6.8-RC1 を出しました。

モジュール:DBFlute-0.9.6.8-RC1
ランタイム:0.9.6.8-RC1

※モジュールはEMecha経由でダウンロードして下さい。

前のSNAPSHOTよりも(かなり)精度があがっています。
(additionalSchemaに関して)

2010/4/16 kubo <dbf...@gmail.com>:

kubo

unread,
Apr 19, 2010, 7:38:17 AM4/19/10
to dbf...@googlegroups.com
jfluteです。

というか、明日リリースしますね。
(これ以上やると結構重たいバージョンになってしまうので)

2010/4/19 kubo <dbf...@gmail.com>:

NAKA

unread,
Apr 19, 2010, 1:36:01 PM4/19/10
to DBFluteユーザの集い
NAKAです。

4つのDBをまたいで、計20個ぐらいのテーブルがあったのですが
見事に関連付けされているようです。
htmlでズラッと出てくるのは、感動的ですね!
早速使っていきたいと思います。

ドキュメントリリースに向けてお忙しいところ
本当にありがとうございました。

kubo

unread,
Apr 19, 2010, 10:04:36 PM4/19/10
to dbf...@googlegroups.com
jfluteです。

NAKAさん、ご報告ありがとうございます。
とても助かります。
(一人でもくもくとやってると、ほんとに
DBFlute使ってる人いるのかなぁって感じにも
なるので、精神的にも助かりますw)

MySQLであれば、create table 文のオプションで
DBコメントに和名を入れれば、SchemaHTMLにも
表示されるようになりますので。もしよかったら。
http://d.hatena.ne.jp/jflute/20081028/1225120253



#
# MySQLのMLで、ちょうどタイムリーに
# 文字化けが話題になってますね...
#

2010/4/20 NAKA <nak...@ca2.so-net.ne.jp>:

NAKA

unread,
Apr 20, 2010, 1:30:03 PM4/20/10
to DBFluteユーザの集い
NAKAです。

> DBFlute使ってる人いるのかなぁって感じにも
> なるので、精神的にも助かりますw)

私は新参者なので良く分りませんが、少なくともibatisよりは100倍良いと思います。
(さっき見たら、やっと3.0GAがリリースされた模様ですが・・・2.3から長すぎ・・・)

2-3年前の本なんかでは「hibernateかibatisか」みたいな論調で書いてある物が殆どでしたが(最近はJPA?)
私は「どっちも面倒すぎる!」と思っていました。(学習コストとかXML地獄とか)
「扱いの難しい遅延ローディングやキャッシュなんか要らん!」という人は、結構多いと思います。
そういう人にとっては、DBFluteは最有力の選択肢になるのではないでしょうか。

> MySQLであれば、create table 文のオプションで
> DBコメントに和名を入れれば、SchemaHTMLにも
> 表示されるようになりますので。もしよかったら。http://d.hatena.ne.jp/jflute/20081028/1225120253

おお!まさにタイムリーなご指導、ありがとうございます。
ちょうどカラムコメントを試しており「反映されないのかなあ・・・」などと思っていて
聞こうかどうしようか迷っていたところでした。jfluteさんは神ですか?(笑)
documentDefinitionMap.dfprop の設定で、キッチリ反映されました。

> # MySQLのMLで、ちょうどタイムリーに
> # 文字化けが話題になってますね...

そうですね。いきなり流量が増えたので何事かと思っていました(笑)
そんなにトラフィックの多いサイトでないなら、問題のレンタルサーバは解約して
自宅サーバで元の環境作れば良いんじゃないの?と思ったのですが・・・
まあ、そんなことを発言する勇気も無いのですけど(笑)

kubo

unread,
Apr 21, 2010, 3:40:13 PM4/21/10
to dbf...@googlegroups.com
jfluteです。

> 2-3年前の本なんかでは「hibernateかibatisか」みたいな論調で書いてある物が殆どでしたが(最近はJPA?)
> 私は「どっちも面倒すぎる!」と思っていました。(学習コストとかXML地獄とか)
> 「扱いの難しい遅延ローディングやキャッシュなんか要らん!」という人は、結構多いと思います。
> そういう人にとっては、DBFluteは最有力の選択肢になるのではないでしょうか。

ありがとうございます。
共通カラムや区分値など、あんまり他にはない
機能を備えてますので、ぜひご利用下さいね。

(共通カラムや区分値は設定すれば、
SchemaHTMLにも表現されます)

ドキュメントが足りてないので心苦しいですが、
GW明けをぜひお待ち下さい。
(それでも全体の量からするとイチローの打率くらいですが)

2010/4/21 NAKA <nak...@ca2.so-net.ne.jp>:
Reply all
Reply to author
Forward
0 new messages