2013-09-08 3 views
1

사용자가 가입 한 모든 것을 기반으로 여러 코스 (비디오)를 제공하는 가입 기반 서비스가 될 사이트를 개발 중입니다. 효율적인 mysql db 구조 조언

은 현재 내가

Users 
------ 

email | pwd | subscription_date | expiration_date 

고유 키가 될 것이다 다음과 같은 DB 구조에게 "이메일"을 고려하고

Course_Subscription 
------- 

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

아마에서 약 15을 시작하고 점차적으로 초과 근무를 증가 제공 과정의 수.

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

하나의 과정에서 20 개 이상의 지부가있을 수 다음과 같이 또한 코스 구독은 각 과정에 대한 다음

테이블 FALSE TRUE의 부울 값 /됩니다.

인증 프로세스에 대한 약간의 정보 - 사용자 로그인 ---> 과정 구독 ---> 과정 장. 사용자 로그인과 코스 가입이 이메일 주소와 비교하여 확인됩니다. 비디오는 재생되기 전에 구독 테이블과 대조하여 확인됩니다.

내 질문은 :

  1. 이이를 구성하는 가장 좋은 방법이 있나요? 아니면 더 나은 대안이 있습니까?
  2. 성능면에서 문제가 있습니까? 아니면 눈에 띄지 않을까요? 여기

내가 인증하고 위의 코드는 구독을 기반 챕터의 목록을 채울 메뉴입니다 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" 
      } 
     } 


    } 
} 

을 채우는 데 사용할 PHP 스크립트의 샘플입니다 . 나는 코드가 완벽하지 않다는 것을 안다, 나는 여전히 그것에 대해 연구하고있다. 그러나 나는 정보에 어떻게 접근 할 것인지에 대한 꽤 괜찮은 아이디어가 있기 때문에 먼저 db의 구조를 정돈하려고했다.

+0

간단히 말해서 ** 이것은 좋은 스키마가 아닙니다. ** –

답변

2

시간이 지남에 따라 디자인을 유지하는 것은 끔찍할 것입니다. 당신이 제안하는 것은 모든 새로운 과정이 귀하의 course_subscription 테이블에 하나 더 많은 컬럼을 추가하고 데이터베이스에 새로운 테이블을 추가한다는 것을 의미합니다.

나는 당신이 user 테이블이 구조 가고 싶어, 기본적으로 user_idcourse_id 구성 및 user_course_subscription 테이블 (비디오 URL 등 포함) 각각의 과정을 설명하는 course 테이블, start-dateend-date입니다.

이렇게하면 모든 코스에 대해 하나의 열을 가질 필요가 없으며 학생을 여러 코스에 추가 할 수 있습니다. 그것은 꽤 표준 "many to many"관계의 예입니다. 접합 테이블 (여기서는 user_course_subscription)이 다른 두 엔티티 사이에 링크를 추가하기 만합니다.

+0

+1이 스키마의 경우 가장 좋은 옵션이 보입니다. –

+0

각 챕터별로 별도로 나열된 챕터를 어떻게 나열할까요? 특정 코스의 테이블을 만들 수 있습니까? 아니면 제가해야 할 또 다른 방법이 있습니다. 왜냐하면 내가 어떻게 사용자와 코스 테이블을 만드는 것이 더 잘 될지를 알 수는 있지만, 나는 여전히 특정 챕터에 정보를 넣을 장소가 없기 때문에 과정에 따라 달라질 것입니다. 그렇다면 개별 과목을위한 별도의 테이블을 갖는 것이 더 낫지 않을까요? – Fahad

+1

@Fahas -이 경우,'course_id'를 참조한 네 번째 테이블을 추가하고 현재의'calculus_1' 테이블 디자인에있는 기본 정보를 추가하십시오. 따라서'course_chapter' 디자인에'course_id','chapter_id', 그리고 특정 정보가 있습니다. 이렇게하면 코스 당 1 개의 테이블을 사용하지 않고 원하는만큼 코스에 챕터를 추가 할 수 있습니다. – SchmitzIT

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 테이블에 있어야합니다.

+0

그 말이 맞습니다. 덕분에 사람들이 이메일 주소를 변경하는 것을 완전히 잊었습니다! – Fahad