2

コーチ、学生、レッスンの 3 つの基本的なエンティティ タイプを持つ PHP アプリを構築しています。コーチは学生向けのデジタル レッスンを作成します。MySQL と innoDB テーブルを使用しています。

要件

  1. コーチと生徒のログイン。
  2. コーチは、1 人の生徒に特化したデジタル レッスンを提供できます。

要件を考えると、どの DB スキーマを使用するのが最適かわかりません。次の 2 つのオプションがあります。

オプション 1
ユーザー (PK ID、user_type (コーチまたは生徒)、名、姓、電子メール、パスワードなど
) )、レッスン名など…)

長所:
- 1 つのユーザー テーブル
- 各ユーザーには一意の ID と電子メールがあります
- 単一のテーブルでログイン認証が簡単になります

短所:
- コーチまたは生徒の User.id がレッスン テーブルに FK として記録されている場合、user_type の検証は行われません。この問題は、コーチまたは学生の User.id を FK として記録する必要がある新しいテーブルで再発します。
- 潜在的なポリモーフィズムの問題と、トラックを正規化する必要性。

オプション 2
コーチ (PK id、名、姓、電子メール、パスワードなど)
生徒 (PK id、名、姓、電子メール、パスワードなど)
レッスン (PK id、FK コーチ ID (参照: コーチ. id)、FK Student_id (参照: Student.id)、lesson_name、lesson_text など…)

長所:
- 正規化された DB スキーマ。独立したコーチ、学生のエンティティ テーブル。
- ユーザー タイプの検証の問題はありません。Coach ID と Student ID の FK は、それぞれ個別に Coach.id と Student.id を指しています。

短所:
- コーチと生徒は同じ ID を持つことができます。(これは、C1001、S1001 などの ID プレフィックスを使用して解決できます)
- コーチと生徒は同じメールアドレスを持つことができます。
- ログイン認証には、1 つのログイン ページに対して 2 つの 2 つのテーブルを照会するか、2 つの異なるログイン ページと認証要求タイプを作成することが含まれます。

どれが一番いいのか本当に悩んでいます。これを行うより良い方法はありますか?

4

2 に答える 2

2

私の意見では、あなたのアプローチは両方ともうまくいくでしょう。最初のものはより普遍的で、現在未知のさまざまな要件に適合できます。それを選択した場合は、ロールの概念をモデルに追加することをお勧めします。「user_type」はロールであり、1 人のユーザーを [同時に] 異なるロールに関連付けることができます。また、Len Silverston による「The Data Model Resource Book」も優れたリソースです。

ただし、スキーマが一般的すぎることを常に望んでいるとは限りません。非常に低いレベルで2つのアプローチの長所と短所を挙げました。特定の技術的問題(克服できるもの)よりも実用性が重要だと思います。私はそれをそのように言います:

1) 長所:

  • スキーマを大幅に変更することなく、新しい機能に簡単に対応できます
  • 非常に柔軟
  • スキーマの上にキューブを簡単に構築
  • 長期プロジェクトに適合

短所:

  • より多くのリソースが必要 (経験豊富な DBA/データ モデル スペシャリスト、比較的長い設計時間)
  • (2) よりずっと複雑

2) 長所:

  • 最初の作業バージョンの迅速な配信
  • 技術者でなくてもかなりわかりやすい(大人になるまで)
  • 小規模なプロジェクト、または [ほとんど] 決して変更されない明確に定義されたドメインを持つプロジェクトのいずれかに適合します

短所:

  • 新しい要件が発生しても、スキーマのリファクタリングを終わらせることはありません
  • プロジェクトが十分に長く存続すると、データベースは「もう使用されていない」列(または他のデータベースオブジェクト)でいっぱいになり、誰も触れたくない
  • 整合性を確保するのが難しい

それが理にかなっていて、あなたのニーズに合った正しい決定を下すのに役立つことを願っています.

于 2013-09-13T15:50:26.533 に答える
1

オプション 1 の方が適切に見えます。

学生とコーチを区別する必要がない場合はコードが単純化され、学生を区別したい場合はオプション 2 とほとんど同じになります。

外部キーを本当に検証する必要がある場合は、トリガーを使用してコーチかどうかを確認できます。

「潜在的なポリモーフィズムの問題と、トラックを正規化する必要性」が何を意味するのかわかりません。.

于 2013-09-13T13:10:24.760 に答える