[seasar-dotnet:1415] Re: 同一テーブルを複数回にわたって結合する

kubo [E-MAIL ADDRESS DELETED]
2009年 7月 31日 (金) 16:28:24 JST


久保です。

> 会員情報照会画面等では、階級の名称を表示するために
> テーブル区分値(classificationDefinitionMap)を使用することを考えていたのですが、
> 変更の度に、DLLを差し替える必要があるため、
> 運用に耐えられないということです。

ありがとうございます。Classification機能自体のの利用有無
というよりは、名称の表示でClassification機能を利用するかどうか
という感じですね。(ちょっと自分が勘違いしました)
もともと、DBFluteのClassification機能は「設定・判定」が
主な目的で、名称の表示に関してはマスタテーブルに名称があるなら
そっちを使うことを想定しています。
当然の判断でまったく問題ないと思います。

> のように、Com_CodeのPKは(codesb_cd(コード種別),code_val(コード値))の複合キーになっており、
> 複数のコードを種別ごとに、コード値と名称などを管理するマスタになっています。
>
> 対して、Pre_Member_Info側では、gender_cd(性別),post_cd(階級)のように、
> コード値に対応するのみのカラムしかありません。

DBを変更する、ってのはやはりもちろんダメですよね。
一応、ML上の情報共有のことを考え、形式的ですが...
できるならば、DBを変更して、

o Pre_Member_Infoにcodesb_cdも保持させて複合FK制約を付与
o Com_Codeに代理キーを付けて、それ経由でFK制約参照
o 複数のマスタテーブルを一つのテーブルに押し込めるのではなく、
 それぞれちゃんとした独立したマスタテーブルとする
 (ExampleDBの会員ステータステーブルみたいな感じ)

をお奨めします。単に名称取得ってだけでなく多くの他の面でも
DBを直した方がメリットが大きいからです。

で、それができないなら、こちらのFixedConditionの機能を
使って実現ができるかもしれません。
http://d.hatena.ne.jp/jflute/20081201/1228126523
「codesb_cd = '0008'」の部分をまさしくfixedConditionとして、
DBFlute上で一つ一つのカラム毎に関連を付与します。
そもそも目的が違う機能なので、ちょっとやってみないと
わからないって感じですが、ぜひお試し下さい。

> DbFluteでは、先述のON句のように定数を渡して結合のようなことを
> 実装する手段は、ありますでしょうか??
ちなみに「DbFluteでは」というより「ConditionBeanでは」ですね。
(外だしSQLを使えばできるので)

2009/7/31 Tatsuya Yakuwa <[E-MAIL ADDRESS DELETED]>:
> 久保様、ご回答ありがとうございます。
>
> 同一テーブルを複数回という点に関しては、
> 外部キーを複数作成することで理解いたしました。
>
>
>> 具体的にどういった要件だったのか教えて頂けますでしょうか?
>> ぜひ参考にしたいと思いますので、差し支えの無い範囲でいいので。
>
> 例えば、会員の階級を表すコードで、
> 運用後に追加変更できるようにしたい場合です。
>
> 会員情報照会画面等では、階級の名称を表示するために
> テーブル区分値(classificationDefinitionMap)を使用することを考えていたのですが、
> 変更の度に、DLLを差し替える必要があるため、
> 運用に耐えられないということです。
>
>
>
> ここからは、おって確認なのですが。
> テーブル構造そのものに関わってしまうようであれなのですが、
>
> /*
> FROM Pre_Member_Info M
>   left outer join dbo.Com_Code C1
>   on (C1.codesb_cd = '0008'
>                 and C1.code_val = gender_cd)
>   left outer join dbo.Com_Code C2
>   on (C2.codesb_cd='0026'
>                 and C2.code_val = post_cd )
> */
> のように、Com_CodeのPKは(codesb_cd(コード種別),code_val(コード値))の複合キーになっており、
> 複数のコードを種別ごとに、コード値と名称などを管理するマスタになっています。
>
> 対して、Pre_Member_Info側では、gender_cd(性別),post_cd(階級)のように、
> コード値に対応するのみのカラムしかありません。
>
> この場合、外部キーを定義するには、Pre_Member_Info側にコード種別に対応するカラムを、
> コード毎に追加する必要がでてきます。
> (もしくは、複合でない一意のキーになる共通のカラムを追加する)
> 例えば、
> /*
> CREATE TABLE [dbo].[Pre_Member_Info](
>        [ID] [int] IDENTITY(1,1) NOT NULL,
>        [member_No] [nchar](10) NULL,
>        [birth_dt] [datetime] NULL,
>        [gender_sb] [nchar](10) NULL,
>        [gender_cd] [nchar](10) NULL,
>        [post_sb] [nchar](10) NULL,
>        [post_cd] [nchar](10) NULL,
> */
> 現状は、これで対応しているのですが。。。
>
> DbFluteでは、先述のON句のように定数を渡して結合のようなことを
> 実装する手段は、ありますでしょうか??
>
>
> 以上です。
> よろしくお願いします。
>
>
> On Thu, 30 Jul 2009 21:24:35 +0900, kubo <[E-MAIL ADDRESS DELETED]> wrote:
>
>> 久保(jflute)です。
>>
>> 八鍬さん、こんばんは
>>
>>> 一つのテーブルに対して、同一テーブルを複数回にわたって
>>
>> こちらの意味の確認ですが、
>> 例えば、
>> 「会員」テーブルと「会員ステータス」テーブルがあったとして、
>> 「会員」テーブルに「現在会員ステータスコード」と
>> 「前回会員ステータスコード」というカラムがあって、
>> それぞれのコード経由で「会員ステータス」を取得したい
>> ということでよろしいでしょうか?
>> (一つのテーブルから同じテーブルに対して複数のFKがある)
>>
>> MemberCB cb = new MemberCB();
>> cb.setupSelect_MemberStatusBy現在();
>> cb.setupSelect_MemberStatusBy前回();
>> ...
>>
>> Member member = memberBhv.selectEntity(cb);
>> ... = member.getMemberStatusBy現在();
>> ... = member.getMemberStatusBy前回();
>>
>> この場合FK制約が貼られていれば、上記の例のように
>> 「テーブル名Byカラム名」という識別子でそれぞれの
>> リレーション毎にメソッドが作成され、それぞれ別個に
>> 扱うことができます。
>>
>> なので、FK制約が貼られていればそういったメソッドが
>> 生成されているはずです。
>>
>>> classificationDefinitionMapを使用することも検討したのですが、
>>> エンドユーザが保守できる要件をみたせなくなってしまうため、
>>> 見送った経緯があります。
>>
>> 具体的にどういった要件だったのか教えて頂けますでしょうか?
>> ぜひ参考にしたいと思いますので、差し支えの無い範囲でいいので。
>>
>> 2009/7/30 Tatsuya Yakuwa <[E-MAIL ADDRESS DELETED]>:
>>>
>>> お世話になっております。
>>> 八鍬(やくわ)と申します。
>>>
>>> DbFluteのConditionBeanについて、おたずねしたいのですが。。。
>>>
>>> 外出しSQLを使用せず、ConditionBeanで
>>> 1つのテーブルに対して、同一テーブルを複数回にわたって
>>> 、結合することは可能でしょうか?
>>>
>>> 例えば、名称マスタや区分マスタなどのコード→名称のようなテーブルから、
>>> 名称を取得するようなケースです。
>>>
>>> http://dbflute.sandbox.seasar.org/contents/condition-bean/basic.html
>>> のDBFluteBasicExampleを参考にしていたのですが、
>>> 同じようなケースが見当たらなかったので。。。
>>>
>>>
>>> --
>>> /*
>>> SELECT M.kojinID
>>> ,M.member_no
>>> ,M.section_cd
>>> ,M.gender_cd
>>>  ,C1.code_nm as gender_nm
>>> ,M.post_cd
>>>  ,C2.code_nm as post_nm
>>>  FROM Pre_Member_Info M
>>>  left outer join dbo.Com_Code C1
>>>  on (C1.codesb_cd = '0008'
>>>                and C1.code_val = gender_cd)
>>>  left outer join dbo.Com_Code C2
>>>  on (C2.code_val = post_cd
>>>                and C2.codesb_cd='0026' )
>>> */
>>> もしくは
>>> --
>>> /*
>>> SELECT kojinID
>>> ,member_no
>>> ,section_cd
>>>  ,(select code_nm
>>>      from dbo.Com_Code
>>>      where codesb_cd='0008'
>>>      and code_val = gender_cd ) as gender_nm
>>>  ,(select code_nm
>>>      from dbo.Com_Code
>>>      where codesb_cd='0026'
>>>      and code_val = post_cd ) as post_nm
>>>
>>>  FROM Pre_Member_Info
>>>
>>> */
>>>
>>> のようなSQLです。
>>>
>>> ちなみに、
>>> classificationDefinitionMapを使用することも検討したのですが、
>>> エンドユーザが保守できる要件をみたせなくなってしまうため、
>>> 見送った経緯があります。
>>>
>>>
>>> 以上よろしくお願いいたします。
>>> --
>>> *----**===**----**===**----**===**----**===**----*
>>>  株式会社 エム・エス・アイ
>>>  システム部 八鍬 達也
>>>  Add:山形市松栄1-5-7
>>>  Tel:023-647-3966 Fax:023-647-3967
>>>  E-mail:[E-MAIL ADDRESS DELETED]
>>>  ☆ ★ ☆    社員ブログ更新中!!!    ☆ ★ ☆
>>>  http://www.msi-net.co.jp/blog/index.html
>>> *----**===**----**===**----**===**----**===**----*
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>> __________ Information from ESET NOD32 Antivirus, version of virus
>> signature database 4292 (20090730) __________
>>
>> The message was checked by ESET NOD32 Antivirus.
>>
>> http://www.eset.com
>>
>>
>>
> --
> 八鍬 達也
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


seasar-dotnet メーリングリストの案内