高效的mysql db结构建议

mae*_*416 1 php mysql

我正在开发一个基于订阅的服务网站,该网站将根据用户注册的内容为用户提供多个课程(视频).

目前我正在考虑以下数据库结构

Users
------

email | pwd | subscription_date | expiration_date
Run Code Online (Sandbox Code Playgroud)

唯一键是"电子邮件"

Course_Subscription
-------

email | calculus_1 | calculus_2 | physics_1 | physics_2 ... | Nth course
Run Code Online (Sandbox Code Playgroud)

提供的课程数量可能从大约15开始,并逐渐增加加班.课程订阅也将是布尔值TRUE/FALSE

然后是每个课程的表格如下:

Calculus_1
----------
id | title | description | video_url |
Run Code Online (Sandbox Code Playgroud)

一门课程可以有20多个章节.

关于身份验证过程的一点信息 - 它将用户登录--->课程订阅--->课程章节.如果用户登录和课程订阅都将根据电子邮件地址进行验证.在播放之前,还将根据订阅表检查视频.

我的问题是:

  1. 这是构建这个的最佳方法吗?还是有更好的选择吗?
  2. 这会在性能方面造成任何问题吗?还是不明显?

这是一个PHP脚本的示例,我将用它来验证和填充html

$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"
          }
       }


  } 
}
Run Code Online (Sandbox Code Playgroud)

上面的代码用于根据订阅填充章节列表的菜单.我知道代码并不完美,我还在努力 - 但我想先确定数据库的结构,因为我对如何访问信息有一个相当不错的想法.

Jon*_*oni 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
Run Code Online (Sandbox Code Playgroud)

您可能必须根据您的具体要求进行调整.例如订阅到期日期:如果有效期仅取决于学生而不是课程,那么将它放在students表格中是有意义的,就像现在一样.但是,如果学生可以在不同的日期订阅不同的课程,并且您希望每个订阅的可能性不同,则应该在subscriptions表格中.