0

学校向けの Web アプリケーションを設計しています。これまでのところ、これらのテーブルを持つデータベースにこだわっています。

ユーザー

  • ID
  • ユーザー名
  • パスワード

プロフィール

  • ユーザー ID (外部キー)
  • 名前
  • 苗字
  • セックス
  • group_id (外部キー)
  • (その他基本情報)

...そして、イベント、委員会、グループなど、現在は関係のない他のテーブル。そのため、ユーザー テーブルにはログインに関する基本情報が格納され、プロファイル テーブルにはユーザーに関するすべての個人データが格納されます。

これで、プロファイル テーブルの *group_id* 列には、グループテーブルでユーザーが現在登録されているグループの ID 列を参照する外部キーが含まれます。ユーザーは一度に 1 つのグループにしか登録できないため、テーブルを追加する必要はありません。

問題は、 group HAS MANY profilesのような関係を宣言することはあまり意味がないということです。代わりに、リレーションはgroup HAS MANY usersである必要がありますが、 usersテーブルには認証情報しか格納されていないため、*group_id* 列をusersテーブルに配置する必要があります。

一方、ORM を使用してグループに登録されているすべてのユーザーを一覧表示し、プロファイルではなくユーザー コレクションを取得したいと考えています。私の見方では、users テーブルは「親」のようなもので、profiles テーブルは users テーブルを拡張するものです。

イベントの出席を設定するときにも同じ問題が発生します。events_attendance テーブルでプロファイルを外部キーとして参照する必要がありますか? または、ユーザー ID を参照する必要がありますか?

もちろん、両方のソリューションを実装して機能させることができますが、どちらが最良の選択でしょうか?

少し掘り下げたところ、両方のソリューションが3NFに準拠していることがわかったので、理論的には正しいですが、データベースを正しい方法で設計するのに苦労しています。

4

1 に答える 1

0

これは、独自の規則の問題です。主体が何であるかを決定する必要があり、その直後に適切な解決策を簡単に見つけることができます。どちらの方法も良いですが、Profile がプロパティであり、User をメイン エンティティと考える場合は、GroupId を User に設定する必要があります。そうでない場合、User と Profile を単一のエンティティとして意味する場合は、GroupId を Profile に残すことができます。これにより、 group HAS MANY profilesと言っているのではなく、 group HAS MANY users と言っているわけではありませ。 適切な 1 対 1 の関係 (ユーザー プロファイル) を設定することで、データの完全性を十分に高めることができます。

于 2013-11-15T21:15:00.310 に答える