MySQL使用索引构建/链接表

时间:2012-10-31 14:16:10

标签: mysql database database-design phpmyadmin

我已经完成了学校课程目录的表格结构设计。我使用了四个表majorscoursescourse_hourscourse_date。下面我详细介绍了每个表的组成部分。某些表将使用基于course_id的索引。我是数据库的新手,并在我的数据库中构建这些表时苦苦挣扎。如何使用course_id将这些表链接在一起?或者是否有更好的方法来为我的目的构建这些表。如果可能的话,提供查询来创建这些表将会很棒。

希望我使用righ类型(intvarchartext等)来表示我的变量。

课程

的示例
id serial
course_name varchar
course_code varchar
description text

course_dates (使用索引)

的示例
id int
course_id int
year date
semester int

course_hours (使用索引)

的示例
id int
course_id int
hours int

主要(一对多关系索引)

的示例
 major_id int
 course_id int 
 major_name varchar

因此,填充的数据库将包含以下内容:

courses

course_id course_code course_name       course_description
1     INF1000     Visual Studio I   "Basic programming"
2     INF1001     Visual Stuido II  "More programming"

course_dates(春季为0,秋季为1,全年为2)

id course_id year semester
1  1         2012 0
2  1         2013 1
3  2         2013 1

course_hours

id course_id course_hours 
1  1         3 
2  1         4 
3  2         4 

majors

id course_id major_name
1  1         Computer Engineering 
2  1         Information Systems 
3  2         Network Administrator

2 个答案:

答案 0 :(得分:3)

我会做一些重组:

  • 为课程添加小时并摆脱course_hours表(我没看到 将小时数提取到一个单独的表中的任何好处)
  • course_dates可能更好地命名为学期,字段为年(int)和semester(int)
  • 专业应该只解释每个专业,所以把course_id拿出并放入外部参照表
  • 将所有表格重命名为单数形式(只是样式首选项)

给你一个像这样的结构: ERD

编辑:回到mysql框。这是这个结构的脚本。记住你可能想要更改字符集和引擎类型,因为每个数据库可以更改它们,这些可能是默认的

CREATE TABLE IF NOT EXISTS `course` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `code` varchar(10) NOT NULL,
  `description` varchar(500) DEFAULT NULL,
  `hours` tinyint(6) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `course_semester_xref` (
  `course_id` int(11) NOT NULL,
  `semester_id` int(11) NOT NULL,
  PRIMARY KEY (`course_id`,`semester_id`),
  KEY `semester_id` (`semester_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `major` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `description` varchar(500) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `major_course_xref` (
  `major_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  PRIMARY KEY (`major_id`,`course_id`),
  KEY `course_id` (`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `semester` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `year` smallint(6) NOT NULL,
  `semester` tinyint(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

ALTER TABLE `course_semester_xref`
  ADD CONSTRAINT `course_semester_xref_ibfk_2` FOREIGN KEY (`semester_id`) REFERENCES `semester` (`id`),
  ADD CONSTRAINT `course_semester_xref_ibfk_1` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`);

ALTER TABLE `major_course_xref`
  ADD CONSTRAINT `major_course_xref_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`),
  ADD CONSTRAINT `major_course_xref_ibfk_1` FOREIGN KEY (`major_id`) REFERENCES `major` (`id`);

答案 1 :(得分:0)

  

表course_hours

     

id course_id course_hours
  1 1 3
  2 1 4
  3 2 4

如果course_hourscourse_dates, year + semester相对应,则应将其整合到course_dates中,否则您无法将其链接在一起并保存不必要的附加表格。