Php 高效的mysql数据库结构建议

Php 高效的mysql数据库结构建议,php,mysql,Php,Mysql,我正在开发一个网站,它将是一个基于订阅的服务,根据用户注册的内容为用户提供多个课程(视频) 目前我正在考虑以下db结构 Users ------ email | pwd | subscription_date | expiration_date 唯一的密钥是“电子邮件” 提供的课程数量可能从大约15门开始,并逐渐增加加班时间。此外,课程订阅的布尔值为TRUE/FALSE 然后,每个课程的表格如下所示: Calculus_1 ---------- id | title | descriptio

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

目前我正在考虑以下db结构

Users
------

email | pwd | subscription_date | expiration_date
唯一的密钥是“电子邮件”

提供的课程数量可能从大约15门开始,并逐渐增加加班时间。此外,课程订阅的布尔值为TRUE/FALSE

然后,每个课程的表格如下所示:

Calculus_1
----------
id | title | description | video_url |
一门课程可能有20多个章节

关于认证过程的一点信息-将转到userlogin->课程订阅---->课程章节。将根据电子邮件地址验证用户登录和课程订阅。在播放视频之前,还将对照订阅表检查视频

我的问题是:

  • 这是构建此结构的最佳方式吗?还是有更好的选择
  • 这会导致性能方面的问题吗?或者它会不会很明显
  • 下面是一个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"
              }
           }
    
    
      } 
    }
    

    以上代码用于菜单,该菜单将根据订阅内容填充章节列表。我知道代码并不完美,我仍在努力——但我想先确定数据库的结构,因为我已经对如何访问信息有了相当不错的想法。

    一个需要通过添加新列和表来更改数据模型的设计,仅仅是为了添加新数据,比如课程,不是一个好的设计。您应该有一个包含课程的表和一个用于订阅的表

    而且,电子邮件不是一个很好的主键选择。主键永远不应更改,但用户可能希望更改其电子邮件地址。因此,通常使用自动递增编号作为主键

    考虑这些建议的模式如下所示:

    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             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
    

    您可能需要根据您的具体要求进行调整。例如,订阅到期日:如果到期日仅取决于学生,而不取决于课程,则可以像现在一样将其放在
    学生
    表中。但是,如果一个学生可以在不同的日期订阅不同的课程,并且您希望每个订阅都有不同的到期日,那么应该将其放在
    订阅
    表中。

    随着时间的推移,您的设计将很难维护。您的建议意味着,每一门新课程都会向您的
    课程订阅
    表中添加一列,并向数据库中添加一个新表

    我想要一个结构,其中有一个
    用户
    表,一个
    课程
    表,描述各个课程(包括视频url等),还有一个
    用户课程订阅
    表,它基本上由一个
    用户id
    和一个
    课程id
    组成,以及
    开始日期
    结束日期


    这消除了对每门课程只有一列的要求,同时仍然允许您将学生添加到多个课程中。这是一个相当标准的“”关系的示例,其中连接表(在本例中为
    用户\课程\订阅
    )只是添加了其他两个实体之间的链接。

    随着时间的推移,您的设计将很难维护。您的建议意味着,每一门新课程都会向您的
    课程订阅
    表中添加一列,并向数据库中添加一个新表

    我想要一个结构,其中有一个
    用户
    表,一个
    课程
    表,描述各个课程(包括视频url等),还有一个
    用户课程订阅
    表,它基本上由一个
    用户id
    和一个
    课程id
    组成,以及
    开始日期
    结束日期


    这消除了对每门课程只有一列的要求,同时仍然允许您将学生添加到多个课程中。这是一个相当标准的“”关系的示例,其中连接表(在本例中为
    user\u course\u subscription
    )只是添加其他两个实体之间的链接。

    简言之,不,这不是一个好的模式。简言之,不,这不是一个好的模式。这很有意义,谢谢,我完全忘了考虑人们改变他们的电子邮件地址!这是有道理的,谢谢,我完全忘了考虑人们改变他们的电子邮件地址!不过,我该如何列出每门课程的独立章节呢。我还会为具体的课程安排一张桌子吗?或者我还有别的方法可以做到这一点。因为虽然我可以看到创建用户表和课程表将如何更好地锻炼身体,但我仍然没有地方将信息放在特定章节中,这些章节将根据课程的不同而有所不同。那么,为各个课程单独设置一个表会更好吗?@Fahas-在该ca中