2

まず、この質問のフィードバックの性質について申し訳ありません。できる限り一般化して、他の人も同様に得られるようにしていますが、この設計についてフィードバックをくれる人が実際にはいないので、皆さんが私を助けてくれることを願っています.

そうは言っても、データベースでさまざまなユーザータイプをモデル化するつもりはありません。ただし、ユーザータイプの資格情報を共有したいと思います。この問題は基本的に継承に関するものであり、RDB ではうまく機能しません。

しかし、私はこのデザインを思いつきました: DB design http://img48.imageshack.us/img48/9196/dbdesign.png

..しかし、それで満足するべきかどうかはわかりません。私が気に入らないのは、そこに含まれるビジネス契約の量です。まず第一に、特定の資格情報に属するユーザー タイプがわかりません。つまり、N 個のテーブルを検索する必要がある可能性があります。N は、取得したユーザー タイプの数です。したがって、ユーザーのタイプをそのユーザーのロールに関連付けることを考えました。したがって、資格情報 A を持つユーザーが「UserType1」と「UserType2」のロールを持っている場合、UserType1 と彼または彼女を表す UserType2 テーブル。-そして、これらの「ビジネスロジック」の制約が好きかどうかはわかりません.. :)

代替設計と同様に、この設計に関するフィードバックは非常に高く評価されます。

前もって感謝します

4

1 に答える 1

4

OOの抽象クラスに類似している場合は、親に識別子列を配置できます。識別子は、子タイプごとに異なる値を持ちます。賢い場合は、子タイプごとに1行のテーブルへのfkです。

または、authcredentialsのusertype1への結合が、任意のusertype1に対して成功するが、他の子タイプに対しては成功せず、他のテーブルに対しても同様に成功することを信頼できます。各子テーブルへの左外部結合では、それがnullではないタイプのすべての列(特にID)がnullであり、それがnullではないIDです。次に、これに基づいて計算列を追加できます。

select 
 a.*, b.*, c.*, 
 case when b.id is not null then 1 else 0 end as is_usertype1, 
 case when c.id is not null then 1 else 0 end as is_usertype2,
from authcredentials a 
 left outer join usertype1 b on (a.id = b.authcredential_id )
 left outer join usertype2 c on (a.id = c.authcredential_id );

次に、使いやすいようにビューを選択します。挿入は引き続き個別のテーブルusertypeとusertype2に行われますが、オブジェクト指向プログラミングでは、ctorも継承されず、共通ベースの2つのサブクラスが必ずしも同様のctorを持っているとは限りません。

基本クラスが派生クラスの前に構築されるC++の場合と同様に、子行を作成する前に親行を作成する必要があります(FKが必要です)。

postgresqlは、このようにテーブル継承を明示的にサポートします。Hibernate ORMは、テーブルをJavaサブクラスにマッピングするためにサポートしています。

于 2009-04-05T16:59:35.943 に答える