具有其他单个表的多个外键的单个表列

时间:2019-12-05 15:33:38

标签: sql postgresql database-design

我有一个部门表,其中Department_id作为主键。

我需要创建一个教师表,其中一行可以引用department_id中的两个值

部门= [("EC", "ELECTRONICS"), ("CS", "Computer Science")]

老师= ("T001", "teacher1", ["CS", "EC"])

是否可以创建这样的表?

2 个答案:

答案 0 :(得分:1)

Department (DeptCode [PK], Name):
    EC, ELECTRONICS
    CS, Computer Science

Teacher (TeacherId [PK], Name, DeptList):
    123, Teacher1, CS
    234, Teacher2, EC
    345, Teacher3, [CS, EC]

不。在数据库表中不能接受Excel电子表格中可能出现的情况。单列CSV是严重错误。它同时破坏了第一范式和第二范式(Dr E F Codd的定义):

  1. 每个域(属性)必须是平台的原子
    意思是,每个属性都不能被整除。

  2. 每个域(属性)不得为集合(重复值)

CSV是可分割的,是一组重复值。如果违反规则,则将没有数据库,可以轻松查询该数据库。您将拥有一桶鱼,有时会起作用。

重复值存储在下级表中。这是关联表,系部门和教师的下属。 PK是组合的,是关系数据库中的标准票价。习惯它。该表不需要另一个id字段。

Department (DeptCode [PK], Name):
    EC, ELECTRONICS
    CS, Computer Science

Teacher (TeacherId [PK], Name):
    123, Teacher1
    234, Teacher2
    345, Teacher3

TeacherDepartment (TeacherId, DeptCode)
    PK (TeacherId, DeptCode):
    123, CS
    234, EC
    345, CS
    345, EC

答案 1 :(得分:0)

虽然您可以创建一个名为教师的表,并具有一个varchar字段,该字段可以将department_details存储为逗号分隔的字符串。从RDBMS的角度来看,这是错误的设计。

您可能希望将教师与部门之间的关系保留在另一个表格中。

+------------+---------------+
| teacher_id | department_id |
+------------+---------------+
|        100 | CS            |
|        100 | EC            |
+------------+---------------+