首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在线学习系统数据库

在线学习系统数据库
EN

Code Review用户
提问于 2012-04-10 14:57:16
回答 1查看 1.8K关注 0票数 3

我不再是密歇根理工大学的毕业生了。我毕业后就做厨师了,而且我几乎在学到的东西都有点生疏了。几周前,我被雇来帮助创建一个在线学习系统。本质上,它将是一所在线学校。我需要能够有部门,专业,班级,学生,讲师,年级等国家博物馆。

我知道我还有很多事情要做,但在我走得更远之前,我想知道我是否在正确的轨道上。我只是在寻求批评,最佳实践,建议.如果值得赞美的话。

这就是我建造的ERD:

这是由DBdesigner4自动生成的SQL:

代码语言:javascript
复制
CREATE TABLE department (
dpt_name VARCHAR(50) NOT NULL AUTO_INCREMENT,
dpt_abbrev VARCHAR(10) NOT NULL,
dpt_desc TEXT NOT NULL,
PRIMARY KEY(dpt_name)
);

CREATE TABLE users (
usr_id INT(8) NOT NULL AUTO_INCREMENT,
usr_lname VARCHAR(50) NOT NULL,
usr_fname VARCHAR(50) NOT NULL,
usr_mname VARCHAR(50) NOT NULL,
usr_primary_email VARCHAR(100) NOT NULL,
usr_reg_date TIMESTAMP NOT NULL,
PRIMARY KEY(usr_id)
);

CREATE TABLE program (
pro_abbrev VARCHAR(8) NOT NULL,
pro_dpt_name VARCHAR(50) NOT NULL,
pro_name VARCHAR(255) NOT NULL,
pro_majormin VARCHAR(50) NOT NULL,
pro_short_desc VARCHAR(255) NULL,
pro_long_desc TEXT NULL,
PRIMARY KEY(pro_abbrev),
INDEX program_FKIndex1(pro_dpt_name)
);

CREATE TABLE hometowninfo (
home_usr_id INT(8) NOT NULL AUTO_INCREMENT,
home_addr1 VARCHAR(100) NULL,
home_addr2 VARCHAR(100) NULL,
home_city VARCHAR(100) NULL,
home_state VARCHAR(100) NULL,
home_zip INT(15) NULL,
home_country VARCHAR(100) NULL,
PRIMARY KEY(home_usr_id),
INDEX hometowninfo_FKIndex1(home_usr_id)
);

CREATE TABLE contact (
con_usr_id INT(8) NOT NULL AUTO_INCREMENT,
con_second_email VARCHAR(100) NULL,
con_phone1 VARCHAR(20) NULL,
con_phone2 VARCHAR(20) NULL,
con_local_addr1 VARCHAR(100) NULL,
con_local_addr2 VARCHAR(100) NULL,
con_local_city VARCHAR(100) NULL,
con_local_state VARCHAR(100) NULL,
con_local_zip VARCHAR(15) NULL,
PRIMARY KEY(con_usr_id),
INDEX contact_FKIndex1(con_usr_id)
);

CREATE TABLE course (
co_pro_abbrev VARCHAR(8) NOT NULL,
co_coursenumber INT(4) NOT NULL,
co_desc_short VARCHAR(255) NULL,
co_desc_long TEXT NULL,
co_days VARCHAR(15) NOT NULL,
co_semester VARCHAR(6) NOT NULL,
co_start_date DATE NOT NULL,
co_stop_date DATE NOT NULL,
co_start_time TIME NOT NULL,
co_stop_time TIME NOT NULL,
PRIMARY KEY(co_pro_abbrev, co_coursenumber),
INDEX course_FKIndex1(co_pro_abbrev)
);

CREATE TABLE student (
st_usr_id INT(8) NOT NULL,
st_co_coursenumber INT(4) NOT NULL,
st_co_pro_abbrev VARCHAR(8) NOT NULL,
PRIMARY KEY(st_usr_id, st_co_coursenumber, st_co_pro_abbrev),
INDEX users_has_course_FKIndex1(st_usr_id),
INDEX users_has_course_FKIndex2(st_co_pro_abbrev, st_co_coursenumber)
);

CREATE TABLE instructor (
ins_co_coursenumber INT(4) NOT NULL,
ins_usr_id INT(8) NOT NULL,
ins_pro_abbrev VARCHAR(8) NOT NULL,
PRIMARY KEY(ins_co_coursenumber, ins_usr_id, ins_pro_abbrev),
INDEX users_has_course_FKIndex1(ins_usr_id),
INDEX users_has_course_FKIndex2(ins_pro_abbrev, ins_co_coursenumber),
INDEX instructor_FKIndex3(ins_pro_abbrev)
);

CREATE TABLE coursefile (
file_co_coursenumber INT(4) NOT NULL,
file_pro_abbrev VARCHAR(8) NOT NULL,
file_fname VARCHAR(255) NOT NULL,
file_type VARCHAR(15) NOT NULL,
file_size VARCHAR(45) NOT NULL,
file_content LONGBLOB NOT NULL,
file_extension VARCHAR(10) NOT NULL,
PRIMARY KEY(file_co_coursenumber, file_pro_abbrev),
INDEX coursefile_FKIndex2(file_pro_abbrev, file_co_coursenumber)
);

CREATE TABLE assignment (
as_id INT(8) NOT NULL AUTO_INCREMENT,
as_pro_abbrev VARCHAR(8) NOT NULL,
as_co_coursenumber INT(4) NOT NULL,
as_name VARCHAR(50) NOT NULL,
as_datecreated DATE NOT NULL,
as_timecreated TIME NOT NULL,
as_desc TEXT NULL,
as_instructions INTEGER UNSIGNED NULL,
PRIMARY KEY(as_id, as_pro_abbrev, as_co_coursenumber),
INDEX assignment_FKIndex1(as_pro_abbrev, as_co_coursenumber)
);

CREATE TABLE assignmentfile (
asgf_pro_abbrev VARCHAR(8) NOT NULL,
asgf_co_coursenumber INT(4) NOT NULL,
asgf_as_id INT(8) NOT NULL,
PRIMARY KEY(asgf_pro_abbrev, asgf_co_coursenumber, asgf_as_id),
INDEX assignment_has_coursefile_FKIndex1(asgf_as_id, asgf_pro_abbrev,  asgf_co_coursenumber),
INDEX assignment_has_coursefile_FKIndex2(asgf_co_coursenumber, asgf_pro_abbrev)
);

CREATE TABLE assigned (
asg_pro_abbrev VARCHAR(8) NOT NULL,
asg_co_coursenumber INT(4) NOT NULL,
vsg_usr_id INT(8) NOT NULL,
asg_as_id INT(8) NOT NULL,
asg_date_due DATE NULL,
asg_time_due TIME NULL,
asg_points_earned INT(5) NULL,
asg_comment TEXT NULL,
asg_submit_date DATE NULL,
asg_submit_time TIME NULL,
asg_attempt INTEGER UNSIGNED NULL,
PRIMARY KEY(asg_pro_abbrev, asg_co_coursenumber, asg_usr_id, asg_as_id),
INDEX student_has_assignment_FKIndex1(asg_usr_id, asg_co_coursenumber, asg_pro_abbrev),
INDEX student_has_assignment_FKIndex2(asg_as_id, asg_pro_abbrev, asg_co_coursenumber)
);
EN

回答 1

Code Review用户

发布于 2012-04-10 18:41:32

这很小,但是我想知道为什么Contact,HometownInfo是分开的表。如果您拥有该信息,则通过usr_id将其与单个用户进行关联,因此它可能与与该用户相同的其他数据位于同一表中。否则,在删除用户之后,就会使这些表中的孤立数据冒风险,诸如此类。

我认为你应该更多地利用Enum,比如学期,因为这样你就可以保证当你需要按学期搜索的时候,数据是以某种标准的形式出现的。

就个人而言,而且有些人可能不同意,我不喜欢将文件作为blobs存储在数据库中,而是将它们作为随机命名的文件存储在目录中,并引用数据库中的文件。这使得DB更小,并且允许工作人员毫无困难地上传真正大的文件(包括视频).

还有祝你好运!

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/10751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档