0

問題-学校向けのグループフォーラムアプリケーションを作成していますが、次の要件に一致するデザインを作成する必要があります。

  • グループとグループメンバー間の多対多の関係。
  • グループメンバーは、学生またはスタッフのいずれかです。(将来的には他のユーザーロールになる可能性もあります)。
  • 私のデータベースにはすでにStudentテーブルとStaffテーブルがあります。

環境-Java、Spring、Hibernate、MySQL

アプローチ-

1.a)DB設計

グループ:| id | 名前| is_active |

group_member:| id | group_id | user_role | student_id | staff_id | is_banned | is_default_user |

1.b)クラス設計(DTOクラス)

グループ:GroupMembergroupMembers[*]など。

GroupMember:UserRole userRole、学生学生、スタッフスタッフなど。

2.a)DB設計

グループ:| id | 名前| is_active |

group_member:| id | group_id | is_banned | is_default_user |

student_member:| id | group_member_id | student_id |

staff_member:| id | group_member_id | staff_id |

2.b)クラスの設計

グループ:GroupMembergroupMembers[*]など。

GroupMember:UserRole userRole、Membermemberなど。

インターフェイスメンバー:getMember():Object

StudentMemberはStudentを拡張しますMember:getMember():Studentを実装します

StaffMemberはStaffを拡張しますMemberを実装します:getMember():Staff

私は2番目のアプローチを好みます。それはより拡張可能であるようです。最初のアプローチでは、常に1つの列がnullになります。それは無駄です。

この種の問題について、言及された環境(冬眠のサポート:私は新しい蜂です)でより良いアプローチはありますか?

4

1 に答える 1

0

はい、他のアプローチもあります。基本的に、Member エンティティがあり、このエンティティには StudentMember と StaffMember の 2 つのサブクラスがあります。StaffMember には Staff との関連付けがあり、StudentMamber には Student との関連付けがあります。

この継承は、3 つの異なる方法でマッピングできます。

  1. すべてを 1 つのテーブルに。これは、最初のデータベース設計につながります。user_role 列は識別子列であり、student_id または staff_id のいずれかが null です。

  2. 各具象クラスには独自のテーブルがあります。これにより、2 つの同一のテーブルが作成されますが、1 つのテーブルには student_id 列があり、もう 1 つのテーブルには staff_id 列があります。

  3. 各クラスには独自のテーブルがあります。これにより、3 つのテーブルが作成されます。1 つ (メンバー) にはすべての共通列 (id、banned、group_id など) が含まれ、もう 1 つは StudentMember 固有の列 (メンバー テーブルを参照する ID、および学生) のみが含まれます。 ID)、および StaffMember 固有の列 (メンバー テーブルを参照する ID、およびスタッフ ID) を含むもの。

すべてのアプローチには長所と短所があります。

  • 最初のものは、NULL 可能な結合列につながりますが、非常に効率的です (たとえば、グループのすべてのメンバーをロードするために結合する必要はありません)。別のテーブルが StudentMember への FK を持つことも不可能ですが、Member に対してのみです。
  • 2番目のものは列の重複につながり、メンバーをロードするために結合が必要です(ただし、StudentMemberまたはStaffMemberをロードするための結合はありません)が、null可能な外部キーがなく、StaffMemberまたはStudentMemberへのFKを持つことは可能ですが、することはできません任意のメンバー。
  • 3 番目の方法は、クエリごとに結合が必要になるため、非効率的です。ただし、列の重複はなく、必要なものへの外部キーを持つことができます。

サブエンティティ間で異なる列が 1 つしかない場合、最初のソリューションを使用します。これは、理解しやすく、クエリと最適化が容易で、クエリがはるかに単純になります。

これらの継承戦略はすべてドキュメントで説明されています。

于 2013-01-30T14:38:41.327 に答える