1

ユーザーがサインアップしたものに基づいて、いくつかのコース (ビデオ) をユーザーに提供するサブスクリプション ベースのサービスとなるサイトを開発しています。

現在、次のdb構造を検討していました

Users
------

email | pwd | subscription_date | expiration_date

一意のキーは「email」になります

Course_Subscription
-------

email | calculus_1 | calculus_2 | physics_1 | physics_2 ... | Nth course

提供されるコースの数は、おそらく約 15 から始まり、時間の経過とともに徐々に増加します。また、コースのサブスクリプションは TRUE/FALSE のブール値になります

次に、次のように各コースの表を示します。

Calculus_1
----------
id | title | description | video_url |

1 つのコースに 20 以上のチャプターがある場合もあります。

認証プロセスに関するちょっとした情報 - userlogin ---> course subscription ---> course chapters に移動します。ユーザーのログインとコースのサブスクリプションの両方がメールアドレスに対して検証される場所。ビデオは、再生前にサブスクリプション テーブルに対してもチェックされます。

私の質問は次のとおりです。

  1. これはこれを構造化するための最良の方法ですか?または、より良い代替手段はありますか?
  2. これにより、パフォーマンスの面で問題が発生しますか? それとも目立たなくなるのでしょうか?

これは、html を認証して入力するために使用する php スクリプトのサンプルです。

$sqlSubscription = "SELECT * FROM course_subscription WHERE `user` = $user && `calculus_1` = TRUE";
$subscriptionResult = mysql_query($sql) or mysql_die($sqlSubscription);
while ($row = mysql_fetch_assoc($subscriptionResult))
{
      $user=$row["email"];
      $calculus_1 =$row["calculus_1"];
      if($user==1 && calculus_1==TRUE)

{

   $sql = "SELECT * FROM calculus_1 ORDER BY `id`";
$result = mysql_query($sql) or mysql_die($sql);
if (mysql_num_rows($result) > 0)
      {
        $data = array();
        while ($row = mysql_fetch_assoc($result))
        {
            $data[] = $rows;
                    echo "HTML THAT WILL CREATE A LIST BASED ON TABLE INFO"
          }
       }


  } 
}

上記のコードは、サブスクリプションに基づいてチャプターのリストを作成するメニュー用です。私はコードが完璧ではないことを知っています.私はまだそれに取り組んでいます.

4

2 に答える 2

5

コースのように、新しいデータを追加するためだけに新しい列やテーブルを追加してそのデータ モデルを変更する必要がある設計は、適切な設計ではありません。コースのテーブルとサブスクリプションのテーブルが必要です。

また、電子メールは主キーとしてあまり適していません。主キーは決して変更すべきではありませんが、ユーザーはメール アドレスを変更したいと思うかもしれません。このため、自動インクリメント番号が pk としてよく使用されます。

これらの提案を考慮したスキーマは次のようになります。

students             courses           subscriptions
---------------      -----------       -------------
student_id           course_id         subscription_id
email                name              student_id (foreign key to students table)
name                 description       course_id  (foreign key to courses table)
subscription date    video_url

これを特定の要件に合わせて調整する必要がある場合があります。たとえば、サブスクリプションの有効期限: 有効期限がコースではなく学生のみに依存する場合、現在のstudentsように表に記載することは理にかなっています。ただし、学生が異なる日付で異なるコースを購読することができ、購読ごとに異なる有効期限を持つ可能性が必要な場合は、subscriptions代わりに表に記載する必要があります.

于 2013-09-08T08:40:28.890 に答える
2

あなたのデザインは、長期にわたって維持するのが恐ろしいものになるでしょう。あなたが提案していることは、すべての新しいコースがテーブルにもう1列追加course_subscriptionし、データベースに新しいテーブルを追加することを意味します。

userテーブルcourse、個々のコースを説明するテーブル (ビデオの URL などを含む)、および基本的に aと a 、および で構成されるuser_course_subscriptionテーブルを持つ構造をお勧めします。user_idcourse_idstart-dateend-date

これにより、コースごとに 1 つの列を持つ必要がなくなり、学生を複数のコースに追加することができます。これは、非常に標準的な「多対多」の関係の例です。ジャンクション テーブル (この場合user_course_subscriptionは ) は、他の 2 つのエンティティ間のリンクを追加するだけです。

于 2013-09-08T08:50:01.657 に答える