◆やりたいこと
(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制約付けるとか、そういう構成がごく普通だと
思っていたのですが、私が根本的に間違っているのでしょうか・・・?
質問なのか愚痴なのか判らなくなって申し訳ありませんが、
ご教授頂ければ幸いです。
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 からこのグループにアクセスしてください。
>
>
そもそもの分割ポリシーについての
議論を一旦置いておいて、
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さんの構成の場合は、実は後者の複数スキーマに
> 相当すると思われますが、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には何ら不備は無いと思っています。
お付き合い頂いてありがとうございました。
またご質問させて頂くこともあると思いますので、その際にはよろしくお願いします。
jfluteさん、ありがとうございます。感激です!
さっそくDLさせて頂きます。