2013-09-08 2 views
1

Я разрабатываю сайт, который будет сервисом на основе подписки, который предоставит пользователям несколько курсов (видео) на основе того, за что они подписались.Эффективный совет mysql db advice

В настоящее время я рассматривал следующую структуру БД

Users 
------ 

email | pwd | subscription_date | expiration_date 

Уникальный ключ будет «электронная почта»

Course_Subscription 
------- 

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

количество курсов, вероятно, начнется в около 15, и постепенно увеличивать сверхурочно. Также подписок курс будет логическое значение TRUE/FALSE

тогда таблица для каждого курса следующим образом:

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

не может быть больше, чем 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" 
      } 
     } 


    } 
} 

Приведенный выше код для меню, которое будет заполнять список глав на основе их подписки , Я знаю, что код не идеальный, я все еще работаю над этим, но я хотел сначала прикрепить структуру db, когда у меня есть довольно приличное представление о том, как я буду получать доступ к этой информации.

+0

Короче говоря, ** НЕТ, это не очень хорошая схема. ** –

ответ

2

Ваш дизайн был бы ужасным, чтобы поддерживать его с течением времени. То, что вы предлагаете, означает, что каждый новый курс добавит еще один столбец в вашу таблицу course_subscription и новую таблицу в базу данных.

Я бы для структуры, в которой у вас есть user стола, course таблицы с описанием отдельных курсов (в том числе URL-адреса видео и т.д.), и user_course_subscription таблицы, которая в основном состоит из user_id и course_id, и start-date и end-date.

Это устраняет необходимость наличия одного столбца для каждого курса, но при этом позволяет добавлять учеников на несколько курсов. Это пример довольно стандартного отношения «many to many», где таблица соединений (в данном случае user_course_subscription) просто добавляет связь между двумя другими объектами.

+0

+1 для этой схемы это выглядит как лучший вариант –

+0

Как бы я пошел о перечислении глав, хотя это отдельный для каждого курса. Могу ли я по-прежнему составлять таблицу для конкретного курса? Или я должен это сделать другим способом. Потому что, хотя я могу видеть, как создание таблиц пользователя и курса будет лучше работать, у меня все еще нет места для размещения информации по конкретным главам, которая будет зависеть от курса. Так было бы лучше иметь отдельную таблицу для отдельных курсов? – Fahad

+1

@Fahas. В этом случае добавьте к нему 4-ю таблицу, ссылаясь на '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