我目前正在为学校管理系统开发一个数据库.有GRADE,SECTION和SHIFT的桌子.
GRADE
====
id PRIMARY KEY
SECTION
====
id PRIMARY KEY
SHIFT
====
id PRIMARY KEY还有另一个表,它包含这样的数据,称为GROUP通过外键,外键还有一个主键.
GROUP
====
id PRIMARY KEY
grade_id FOREIGN KEY REFERENCES GRADE(id)
section_id FOREIGN KEY REFERENCES SECTION(id)
shift_id FOREIGN KEY REFERENCES SHIFT(id)现在我有一个污名化的污点,并希望有更多经验的设计师的建议.一个名为SUBJECT的表,它包含引用GRADE和主键的外键(某一等级总是有相同的科目)。
SUBJECT
====
id PRIMARY KEY
grade_id FOREIGN KEY REFERENCES GRADE(id)现在,除了主键之外,我还有一个名为CLASS的表,它通过外键引用SUBJECT、PROFESSOR和GROUP .
CLASS
====
id PRIMARY KEY
subject_id FOREIGN KEY REFERENCES SUBJECT(id)
professor_id FOREIGN KEY REFERENCES PROFESSOR(id)
group_id FOREIGN KEY REFERENCES GROUP(id)我想知道,如果在CLASS表引用上向下钻取一个级别,就可以通过两种不同的方式访问相同的GRADE (通过SUBJECT和GROUP)。我不包括表的代码,因为我确实认为这会使这个问题变得更长,当然还有更多的表。我的数据库已经实现,并与适当的应用程序工作,但我想看看设计是否可以改进。提前谢谢。*注:我知道,在我的案例阐述中,我使用保留词作为表名,但只是为了说明性目的,也不包括所有的表格.我也有一个STUDENT表,作为对GROUP的引用,这就是为什么我在这样的表中包含了一个主键。我希望现在我的问题得到更好的解释,我是新来的这类网站。
发布于 2015-06-28 16:21:22
考虑到我已经理解了这个问题,下面的图片描述了(数据库的一部分),其中从A到B的箭头对应于表A到表B的外键:

实际上,Grades是由Groups和Subjects引用的,如果通过这两种关系中的一种访问,那么每个类都必须具有相同的等级。
我认为在这种情况下你有两个选择:
Subject中移除为Grade,如果需要查找某一主题的等级,则将该表与类、课程和年级相结合。这样你就简化了情况,但你可以创造出与特定成绩无关的科目。我很喜欢第一种解决方案:但是,在这两种解决方案中,重要的是插入表Grade、Subject、Course和Classes中的对象,同时注意不要引起不一致。这样做的最佳方法是在数据库存储过程中定义操作多个对象和/或执行所有正确的检查,并要求应用程序(S)只使用它们,而不显式地插入记录。
https://dba.stackexchange.com/questions/105332
复制相似问题