MySQL使用索引构建/链接表

Posted

技术标签:

【中文标题】MySQL使用索引构建/链接表【英文标题】:MySQL Building/linking tables using index 【发布时间】:2012-10-21 00:48:30 【问题描述】:

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

希望我对变量使用正确的类型(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

ma​​jors表示例(一对多关系-索引)

 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

【问题讨论】:

【参考方案1】:

我会做一些重组:

为课程添加小时数并删除 course_hours 表(我看不到 将小时数提取到单独的表格有什么好处) course_dates 最好命名为学期,字段为年 (int) 和学期 (int) 专业应该只解释每个专业,所以取出 course_id 并将其放入外部参照表中 将所有表格重命名为单数形式(只是样式偏好)

为您提供如下结构:

编辑:让它回到一个 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`);

【讨论】:

这太完美了!我可以适应 MySQL。 用 mysql 脚本更新,希望这是你需要的,祝你数据库愉快! 谢谢,你能帮我写一个查询,将所有行并排显示吗? 把它作为另一个问题发布,有很多人在等着炫耀他们的查询技能。我今天会很忙,但是如果您愿意,可以在此处的评论中链接它,我稍后会看一下并确保得到答复 您可能对这个QUESTION 感兴趣,它几乎可以帮助您查询以联合表。【参考方案2】:

表 course_hours

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

如果course_hours对应course_dates, year + semester,则应将其集成到course_dates中,否则无法将其链接在一起,并且会保存一个不必要的附加表。

【讨论】:

以上是关于MySQL使用索引构建/链接表的主要内容,如果未能解决你的问题,请参考以下文章

mysql远程表链接

MySQL 自联接表 Next/Prev 行性能

Python 图_系列之基于<链接表;实现无向图最短路径搜索

MySQL 索引

mysql 使用UNION ALL问题

1MySQL 基础