高效的mysql db结构建议

时间:2013-09-08 08:33:21

标签: php mysql

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

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

Users
------

email | pwd | subscription_date | expiration_date

Unique Key将是" email"

Course_Subscription
-------

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

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

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

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

单个课程可能有20多个章节。

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

我的问题是:

  1. 这是构建这个的最佳方式吗?还是有更好的选择吗?
  2. 这会在性能方面造成任何问题吗?或者它不会引人注意?
  3. 以下是我将用于验证和填充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"
              }
           }
    
    
      } 
    }
    

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

2 个答案:

答案 0 :(得分: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表中。

答案 1 :(得分:2)

随着时间的推移,你的设计会很糟糕。您提出的建议意味着每个新课程都会在您的course_subscription表中添加一列,并为数据库添加一个新表。

我会选择一个结构,你有一个user表,一个描述各个课程的course表(包括视频网址等)和一个user_course_subscription表,它基本上由user_idcourse_id以及start-dateend-date组成。

这消除了为每门课程设置单个列的要求,同时仍允许您将学生添加到多个课程。这是非常标准的“many to many”关系的一个示例,其中联结表(在本例中为user_course_subscription)只是添加了其他两个实体之间的链接。