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