我让学生在一个school.Here数据库是我到目前为止有:
如果你不喜欢读书跳转到“简单”的一部分
问题是,我不是很满意这个设计。 我想要的组合grade
, subgrade
和id_class
是唯一的,并作为学生表的主键。 我可以删除student_id
,并从3复合键,但我不想,要么。 也许我应该让另一个表可以说combination_id
地方grade
, subgrade
和id_class
外键并有一个额外的列comb_id
,可作为表ID。 而所有列将是主键。 但问题是,这3列仍然可以重复,因为这额外的列(的comb_id
)。 例如,我可以有相同的grade
, subgrade
和class_id
,但不同comb_id
这将使因为表(的4列的组合键的行有效combination_id
)。
总之我想students_id
保持表的唯一主键,但成为一个外键到另一个表这是莫名其妙的独特组合grades
, subgrade
和class_id
。
如果我是不够明确要求在下面的意见,并感谢你提前。
PS 我的indescriptive标题抱歉,但我感觉不好的命名
编辑1:为了更清楚: grade
为1〜12 subgrade
可以是到j id_class
可以是1至30,这是你在课堂上号
因此,学生可以从图7b类和他的数类 - 5
不要混用唯一键和主键的概念。 可以很好地添加一个唯一的密钥跨越三个grades
, subgrade
和class_id
。 这样一来,没有两行可能会对这些三列的值相同。 当你写,你不希望有这三个作为一个复合主键,我不知道一个复合唯一补充键是否会更好。 如果没有,你必须在组合键是可以接受的澄清。
要创建一个独特的键,你可以使用下面的SQL 语句 :
ALTER TABLE students ADD UNIQUE gsc (grades, subgrade, class_id);
这个词gsc
也只是我从键列的首字母组成的名称; 使用任何你想要的名字,因为它并不重要,除非你想找出一些关键的EXPLAIN
输出或相似。
我不是你为什么想你所描述的完全不明确的,但我想看看下面的方法模型...
你有学生
- 他们是独立的实体,而不是其他实体的复合
- 他们有自己的属性; 姓名,出生日期等
你上课
- 这是学生群体
- 每个accademic同期的“类”中有不同的学生
- 他们也有自己的属性; 等级,分等级等
你有你的模型额外的属性,我将无法正常使用
- 如果一个类具有20个学生,它们中的每是确定与二次ID从1至20个
这将使我下面的维度表
Student Class Grade SubGrade
----------------------- ------------------------ ----------------- -----------------
id INT PK id INT PK id INT PK id INT PK
first_name VARCHAR(45) name VARCHAR(45) name VARCHAR(45) name VARCHAR(45)
last_name VARCHAR(45) grade_id INT FK desc VARCHAR(45) desc VARCHAR(45)
etc, etc subgrade_id INT FK etc, etc etc, etc
在Class
表将有一个独特的约束(grade_id, subgrade_id)
因此只有一个类可能永远不会7b
。
然后,你需要涉及学生用事实表他们班...
Class_Membership
-----------------------
id INT PK
student_id INT FK
class_id INT FK
academic_year INT
如果一个学生应该永远只能是在一个类中的任何学年,你会放一个独特的约束(student_id, academic_year)
或者,你可以在该学年Class
表。 这意味着,你将不得不重复每年同一类,但在某些年份类7g
可能不存在(因为有学生小于今年为例)。
同样,你可以有谁动学生7b
到7c
年中。 在这种情况下Class_Membership
表可以有一个start_date
字段和可能的end_date
字段。
那然而,没有直接创建id_class
场(1-20与20个学生一个班)。 个人而言,我不会有这样的领域, id
从外地Class_Membership
表格可大部分相同的功能,并可能附加功能。 它是必要的,但是,你可以简单地把它添加到Class_Membership
表...
Class_Membership
-----------------------
id INT PK
student_id INT FK
class_id INT FK
academic_year INT
class_member_id INT
然后,你还可以有一个独特的约束(academic_year, class_id, class_member_id)
有相当多的灵活性,在这里,根据您的具体现实世界的模型和你的特殊需要。 但希望这个例子是一个良好的开端为您服务; 维表列出的实体,和一个事实表(或表)有关这些实体一起和/或进一步描述的实体。
alter table <TableName> add constraint <ConstraintName> unique(<col1>, <col2>)
Modified the answer due to syntax mistakes. Mentioned above is correct.