0

在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,
);
4

1 回答 1

1

您已声明以下规则:

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

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

3-我没有记录老师教哪门课程,而是记录 x 或 y 学院正在教什么课程

4-此外,每个学院都有一个主要联系人,与导师不同,一个联系人可以是多个学院的一部分。

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

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

B- AcademyCource 表

列定义:

  `instructor_id` int(11) NOT NULL,

违反你的规则#3

C- 课程表

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

D 表上次联系方式

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

E-MainContact 表和 Main_Contact_Bridge

第 4 条规则是:

4-A 每个学院指定 1 个主要联系人

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

如果您不跟踪历史约会,则上述规则不需要 Main_Contact_Bridge。这种关系变成了一对多的关系,一方面是联系人,而多方是学院。

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

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

F-教练表

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

还要考虑上述关于联系人的观点。

E-您应该使用正确的约束/FK 语法。参见例如:MySQL FK

于 2013-11-14T09:58:43.067 回答