表结构和外键

时间:2013-11-14 08:20:07

标签: mysql foreign-keys table-structure

在mysql数据库中,我总共有7个表。在正常情况下,教练只属于一个学院,但学院可以有许多教师。以同样的方式,可以在一个学院教授许多课程。我没有记录教师讲授哪门课程,但在x或y学院教授的课程。每个学院都有一个主要联系人,与教师不同,联系人可以是几个学院的一部分。最后,我想运行一个查询,在那里我可以看到我选择的特定学院的链接数据。

下面的表格是否构建为存储/显示数据,而不存在相同教师,课程等的重复值?

CREATE TABLE IF NOT EXISTS `academies` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(25) NOT NULL,
  `mou_id` int(11) default NULL,
  `academy_id` int(11) NOT NULL,
  `street_address` varchar(50) NOT NULL,
  `city` varchar(25) NOT NULL,
  `state` varchar(25) NOT NULL,
  `country` varchar(25) NOT NULL,
  `zipcode` varchar(5) NOT NULL,
  `telephone` varchar(15) NOT NULL,
  `comments` text,
  `last_contacted` date default NULL,
  PRIMARY KEY  (`id`)
) ;



CREATE TABLE IF NOT EXISTS `academy_courses` (
  `id` int(11) NOT NULL auto_increment,
  `academy_id` int(11) NOT NULL,
  `course_name` varchar(75) NOT NULL,
  `course_id` int(11) NOT NULL,
  `instructor_id` int(11) NOT NULL,
  `start_date` date default NULL,
  PRIMARY KEY  (`unique_id`),
  KEY `course_id` (`academy_id`,`course_id`)
);


CREATE TABLE IF NOT EXISTS `courses` (
  `course_id` int(11) NOT NULL auto_increment,
  `course_name` varchar(75) NOT NULL,
  PRIMARY KEY  (`course_id`)
);


INSERT INTO `courses` (`course_id`, `course_name`) VALUES
(1, 'Math'),
(2, 'English'),
(3, 'Science'),
(4, 'HIstory');


CREATE TABLE IF NOT EXISTS `instructors` (
  `instructor_id` int(11) NOT NULL auto_increment,
  `academy_id` int(11) NOT NULL,
  `instructor_name` varchar(50) NOT NULL,
  `instructor_phone` varchar(15) default NULL,
  `instructor_email` varchar(55) default NULL,
  PRIMARY KEY  (`instructor_id`),
  KEY `academy_id` (`academy_id`)
);


CREATE TABLE IF NOT EXISTS `last_contacted` (
  `talkedto_id` int(11) NOT NULL auto_increment,
  `academy_id` int(11) NOT NULL,
  `talkedto_name` varchar(50) NOT NULL,
  PRIMARY KEY  (`talkedto_id`),
  KEY `academy_id` (`academy_id`)
);


CREATE TABLE IF NOT EXISTS `main_contact` (
  `contact_id` int(11) NOT NULL auto_increment,
  `academy_id` int(11) NOT NULL,
  `contact_name` varchar(50) NOT NULL,
  `contact_phone` varchar(15) default NULL,
  `contact_email` varchar(55) default NULL,
  PRIMARY KEY  (`contact_id`),
  KEY `academy_id` (`academy_id`)
);



CREATE TABLE IF NOT EXISTS `main_contact_bridge` (
  `academy_id` int(11) NOT NULL,
  `contact_id` int(11) NOT NULL,
  PRIMARY KEY  (`contact_id`,`academy_id`),
  KEY `academy_id` (`academy_id`)
);

更新:基于Emmad Kareem的回答

CREATE TABLE IF NOT EXISTS `person` (
 id int(11) NOT NULL auto_increment,
 `academy_id` int(11) NOT NULL,
 `person_name` varchar(50) NOT NULL,
 `person_email` varchar(50) default NULL, 
 `person_phone` varchar(15) default NULL,
 PRIMARY KEY (`id`),
 CONSTRAINT `academy_id` FOREIGN KEY (`academy_id`) REFERENCES `academy` (`academy_id`) ON DELETE CASCADE ON UPDATE CASCADE,
);

1 个答案:

答案 0 :(得分:1)

您已说明以下规则:

1 - 教师只属于一个学院,但是学院可以有很多教师

2 - 以同样的方式,可以在一个学院教授许多课程。

3 - 我没有记录教师讲授哪门课程,但是在x或y学院教授的课程

4 - 每个学院都有一个主要联系人,与教师不同,联系人可以成为几个学院的一部分。

以下是您可能需要考虑和修复的一些问题。

A-使用单数形式表格名称。例如:学院

B- AcademyCource表

列定义:

  `instructor_id` int(11) NOT NULL,

违反你的规则#3

C-课程表

表定义没有对Academy表的FK引用。这与要求#2,3

相矛盾

D-Table LastContacted

您尚未在要求中提供此表的规则,但我建议将其与联系人关联,并且不将联系人姓名作为自由文本,否则,联系人的用途是什么?

E-MainContact表和Main_Contact_Bridge

规则4是:

4-A每个Acaddemy任命1个主要联系人

4-B每个联系人都可以被指定为0,1或更多学院的主要联系人

如果您没有跟踪历史记录约会,则上述规则不需要Main_Contact_Bridge。这种关系变成了一对多,一方是接触,另一方是学院。

如果要跟踪历史记录,则Main_Contact_Bridge是合理的,但您需要添加2列以显示约会的开始日期和结束日期。您如何执行以下规则:在给定时间点,学院只有一名联系人?这需要进一步分析。

此处的另一个问题是,如果您有一个单独的联系人表,并且该联系人是其中一名教师,那么该人员信息将在系统中输入2次。这种情况可能是可以接受的,但是在一个好的设计中你想要避免这种情况。避免这种情况的一种方法是创建一个名为“Person”的表,并添加一列来指示该人是教师还是联系人。

F-Instructor Table

您的设计假设教师只能在给定时间点为1个学院工作。如果是这种情况,那就没关系。如果没有,您需要通过桥接表来解决多对多关系。

还要考虑上面提到的有关联系人的观点。

E-您应该使用适当的约束/ FK语法。例如,请参阅:MySQL FK