DBFlute: 複合主キーとは相性悪し...

@DBFlute, Java, 複合主キー, 複合PK, 複合外部キー, 複合FK
DBFluteは「複合主キーのテーブル」では、
o Behavior.LoadReferrer
o Behavior.QueryUpdate
o Behavior.QueryDelete
o ConditionBean.ExistsSubQuery
など、サブクエリ系の機能が利用できません。
なので、サロゲートキーを利用して複合主キーを
無くすのがお奨めです。

追記(2010/07/29):
幾つかの機能はサポートされるようになりました。
http://d.hatena.ne.jp/jflute/20090714/1247566634

ちなみにこれは、大抵の他のツールでも似たような制限が
ある場合もありますし、純粋にJOIN句書くのが大変だし、
IN句のSubQuery(DBFlute的にはInScopeSubQuery)が
どうにもならなかったりと、周辺のものとことごとく
相性が良くありません。なので、DBFluteを使うか使わないかは
あまり関係なく設計時に考慮することが良いと考えています。

但し、絶対に忘れてはならないのが、

「サロゲートキー付けたら、元のビジネスキーにユニーク制約を」

結構、色んなシステムのDBを見る機会がありますが、
(DBFluteを使ってるシステムに限らず)
意外に多いのが上記のユニーク制約の付け忘れです。
付け忘れというかそういう概念すら無い場合もあったりします。
「なんでもかんでもとにかくID付ければ」というのだけが頭にあって、
それ以上のことが考えられていないケースがあります。
サロゲートキーを付けるだけでは、ビジネス的な制約が無くなってしまい、
周辺のものと相性は良くなりますが、データ不整合のゴールキーパーが
いなくなってしまいます。IDを付けることに反対ではないですが、
安全性を(わざわざ)失って開発してる様をみてると悲しくなります。
(結合テストとかでSQLが落ちて、必死にデバッグして
 結局テストデータの不整合が原因だった、って。。。)

なので、サロゲートキーはお奨めですが、そのときユニーク制約も
一緒に付けることがお奨め(というか個人的には必須)です。