[Seasar-user:17213] Re: 2 Re: 2 多対一関連と dto への詰め込みについての質問

oriwa [E-MAIL ADDRESS DELETED]
2009年 4月 8日 (水) 06:26:41 JST


中村様、Kobayashi様
おはようございます。ご教示ありがとうございます。

表の構造は自分もおかしいと思いますが、JDBCレルム側の仕様だと思います。
複数の解説ページに、usersの方にuser_idとuser_pass, roleの方にuser_role, user_idという二つの表を持たせる必要があるとの説明がありました。
#これが仕様かどうか?表の構造を変えても正常に動作するかは未検証です。

システム側の要求としては、ひとつのroleが複数のuserを持つ、ことは必須です。
#departmentとemployeeのように
ひとつのuserが複数のroleを持つこともあります。例えば、工場内で工場長は製造、物流、購買というすべてのroleが必要になることが考えられます。なので、多対多になります。この場合は、中村様にご教示いただいた方法で対応できることは理解しました。
ただし、これは「工場長」というroleを設定することで多対一をキープすることもできると思います。

ひとりのuserが複数のroleを持つことを許すかどうかを決定する必要があると思います。
ただし、JDBCレルム側が、複数のroleを持つuserに対し、どのroleと判断するのかを調べてみる必要があると思います。

user<-ManyToOne->roleでよくて、普通に表を作成するなら、Kobayashi様にご教示いただいたとおりにすると思います。
#userにroleの外部キーを持たせて、roleからuser_idを外す

> 「存在しないuser_idが登録されることを防ぐためにroleの方に外部キーを設定
> しました。」という理由がよくわかりませんでした。

外部キーを設定しない場合、role側のuser_idを手打ち入力で登録した場合、typoなどで存在しないuserを登録してしまう可能性があるように思いましたので、外部キーにしました。これなら、少なくともデータベースではじいてくれることを期待しました。

ところで、JDBCレルムを使った認証を採用することは一般的ではないのでしょうか?
車輪の再開発には肯定的ですが、今回は時間と自分の能力的な関係で、今ちゃんと動作する車輪があるなら、それを再利用したいと考えています。

以上、よろしくお願いします。

----- Original Message -----
From: Koichi Kobayashi <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Sent: Tue, 07 Apr 2009 17:00:41 +0900
Subject: Re: [Seasar-user:17203] Re: 2 多対一関連と dto への詰め込みについての質問


>小林 (koichik) です.
>
>Date:    7 Apr 2009 10:39:19 +0900
>From:    oriwa <[E-MAIL ADDRESS DELETED]>
>To:      [E-MAIL ADDRESS DELETED]
>Subject: [Seasar-user:17195] 2 多対一関連と dto への詰め込みについての質問
>
>> 例えば、下記の二つの表があったとき、
>> create table users (
>> user_id varchar(15) primary key,
>> user_pass varchar(15) not null,
>> user_name varchar(63)
>> );
>> create table role (
>> user_id varchar(15) not null,
>> user_role varchar(15) not null,
>> PRIMARY KEY(user_id, user_role),
>> FOREIGN KEY(user_id) REFERENCES users(user_id)
>> );
>> ---
>> (1) ひとつのRoleに複数のuserが属するので、
>
>そうなってはいませんね.
>Role の主キーには user_id が含まれているので,
>一つの Role は必ず一つの Users と関連します.
>
>同じ user_role を持ち user_id が異なる複数の
>Role が存在することは可能ですが,それらは別の
>Role です (それを一つの Role としたいなら
>中村さんが書いているように関連テーブルを
>使うべきです).
>
>逆に,同じ user_id を持ち,異なる user_role を
>持つ Role が存在可能なので,一つの Users に
>複数の Role が関連します.
>
>よって,
>
>> s2-jdbc-genでは、users<-OneToMany->roleとして生成されます。
>> #Usersエンティティの方にroleListが作成される
>
>となります.
>
>> 外部キーが設定されている方がManyになるとの規則があるとのことですが、今回の場合は存在しないuser_idが登録されることを防ぐためにroleの方に外部キーを設定しました。
>> このような場合、正しくrole<-OneToMany->usersとするためにはどのようにすればいいでしょうか?
>
>ちょっと制約がよく分からないのですが,素直に
>Users の方に外部キーを持たせるとこんな感じ.
>
>create table users (
>user_id varchar(15) primary key,
>user_pass varchar(15) not null,
>user_name varchar(63)
>user_role varchar(15) not null,
>FOREIGN KEY(user_role) REFERENCES role(user_role)
>);
>
>create table role (
>user_role varchar(15) primary key
>);
>
>この Users は user_role を必須にしてます.
>
>
>-- 
><component name="koichik">
>    <property name="fullName">"Koichi Kobayashi"</property>
>    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
>    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
></component>
>
>_______________________________________________
>Seasar-user mailing list
>[E-MAIL ADDRESS DELETED]
>https://ml.seasar.org/mailman/listinfo/seasar-user
>


Seasar-user メーリングリストの案内