Php 相对MySQL数据库

Php 相对MySQL数据库,php,mysql,database,Php,Mysql,Database,我有一个MySQL数据库表,其构建如下。 班级下面的数字表示班级的“级别”,如高、中、低,0表示不参加该班 我需要建立另一个表来保存每节课的家庭作业,但我有点不知道如何建立这个表,特别是指出行的确切列必须是什么,因为每节课都没有特定的内容来表示它。一个适当规范化的结构会有一个单独的课程表,给每个学生一个id,另一个表格通过包含学生id、课程id和级别将学生放入课程 CREATE TABLE students ( id INT NOT NULL PRIMARY KEY AUTO_INCREME

我有一个MySQL数据库表,其构建如下。 班级下面的数字表示班级的“级别”,如高、中、低,0表示不参加该班


我需要建立另一个表来保存每节课的家庭作业,但我有点不知道如何建立这个表,特别是指出行的确切列必须是什么,因为每节课都没有特定的内容来表示它。

一个适当规范化的结构会有一个单独的课程表,给每个学生一个id,另一个表格通过包含学生id、课程id和级别将学生放入课程

CREATE TABLE students (
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(64) NOT NULL,
  password VARCHAR(64), 
  email VARCHAR(...)
  UNIQUE KEY (username)
);

CREATE TABLE courses (
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(64) NOT NULL
);

/* If a record doesn't exist for a course and student, 
   the student isn't enrolled in that course. Otherwise,
   the level is defined here */
CREATE TABLE enrollments (
  id INT NOT NULL PRIMARY KEY,
  student_id INT NOT NULL,
  course_id INT NOT NULL,
  level INT NOT NULL,
  /* Each student may be enrolled only once per course */
  UNIQUE KEY (student_id, course_id),
  FOREIGN KEY (student_id) REFERENCES students (id),
  FOREIGN KEY (course_id) REFERENCES courses (id)
);
最后,您可以为每门课程中分配的作业创建一个表格:

CREATE TABLE assignments (
  id INT NOT NULL PRIMARY KEY,
  course_id INT NOT NULL,
  description TEXT
  /*... other columns related to the assignment as necessary*/
);
如有必要,让学生完成作业:

CREATE TABLE student_assignments (
  student_id INT NOT NULL,
  assignment_id INT NOT NULL,
  assignment_body TEXT, /* or whatever... */
  /* Or to track when completed */
  submitted_timestamp TIMESTAMP,
  PRIMARY KEY (student_id, assignment_id),
  FOREIGN KEY (assignment_id) REFERENCES assignments (id),
  FOREIGN KEY (student_id) REFERENCES students (id)
);

一个适当规范化的结构将有一个单独的课程表,为每个课程提供一个id,另一个表通过包含学生id、课程id和级别将学生放入课程中

CREATE TABLE students (
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(64) NOT NULL,
  password VARCHAR(64), 
  email VARCHAR(...)
  UNIQUE KEY (username)
);

CREATE TABLE courses (
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(64) NOT NULL
);

/* If a record doesn't exist for a course and student, 
   the student isn't enrolled in that course. Otherwise,
   the level is defined here */
CREATE TABLE enrollments (
  id INT NOT NULL PRIMARY KEY,
  student_id INT NOT NULL,
  course_id INT NOT NULL,
  level INT NOT NULL,
  /* Each student may be enrolled only once per course */
  UNIQUE KEY (student_id, course_id),
  FOREIGN KEY (student_id) REFERENCES students (id),
  FOREIGN KEY (course_id) REFERENCES courses (id)
);
最后,您可以为每门课程中分配的作业创建一个表格:

CREATE TABLE assignments (
  id INT NOT NULL PRIMARY KEY,
  course_id INT NOT NULL,
  description TEXT
  /*... other columns related to the assignment as necessary*/
);
如有必要,让学生完成作业:

CREATE TABLE student_assignments (
  student_id INT NOT NULL,
  assignment_id INT NOT NULL,
  assignment_body TEXT, /* or whatever... */
  /* Or to track when completed */
  submitted_timestamp TIMESTAMP,
  PRIMARY KEY (student_id, assignment_id),
  FOREIGN KEY (assignment_id) REFERENCES assignments (id),
  FOREIGN KEY (student_id) REFERENCES students (id)
);

您需要将结构规范化为
用户
家庭作业
。然后你可以有一个
users\u classes
关系表和一个
users\u homotation
表。用户、类和家庭作业都是表?如果你真的不想规范结构,你可以总是有一个
users\u homotation
表,其中包含列
hw\u id
username
,和
subject
。不过这太糟糕了。您需要将结构规范化为
用户
,以及
家庭作业
。然后你可以有一个
users\u classes
关系表和一个
users\u homotation
表。用户、类和家庭作业都是表?如果你真的不想规范结构,你可以总是有一个
users\u homotation
表,其中包含列
hw\u id
username
,和
subject
。那太恶心了。表格“让学生完成作业”到底是做什么的?“我看不出它是如何定义某件事是否完成的。”亚历克斯·卡斯特罗把你需要的东西都放进去了。基本上,我这里的框架只有一个文本列来显示学生作业的内容(就像提交的作业存储在数据库中一样)。如果您希望跟踪的是作业是否/何时提交,只需使用
submitted\u time
timestamp列即可。当学生交作业时,会添加行并设置时间戳。如果学生没有行,则表示作业未完成。谢谢!我还想知道这些级别是如何定义的?这里的数据库似乎只是为级别存储了一个数字。@AlexCastro我只是将其作为一个数字,就像您在示例中所做的一样,我没有添加关系表来定义这些数字。你可以这样做,或者只是在一个varchar列中存储“高、中、低”而不是那个数字。表“让学生完成作业”到底是做什么的?“我看不出它是如何定义某件事是否完成的。”亚历克斯·卡斯特罗把你需要的东西都放进去了。基本上,我这里的框架只有一个文本列来显示学生作业的内容(就像提交的作业存储在数据库中一样)。如果您希望跟踪的是作业是否/何时提交,只需使用
submitted\u time
timestamp列即可。当学生交作业时,会添加行并设置时间戳。如果学生没有行,则表示作业未完成。谢谢!我还想知道这些级别是如何定义的?这里的数据库似乎只是为级别存储了一个数字。@AlexCastro我只是将其作为一个数字,就像您在示例中所做的一样,我没有添加关系表来定义这些数字。您可以这样做,或者只在varchar列中存储“high、middle、low”而不是该数字。