【问题标题】:Single table column having multiple foreign keys of other single table具有其他单表的多个外键的单表列
【发布时间】:2020-03-30 13:55:59
【问题描述】:

我有一个以 department_id 作为主键的部门表。

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

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

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

是否可以创建这样的表?

【问题讨论】:

  • 你的意思是你想在一个单元格中存储 2 个逗号分隔的值?
  • 听起来您应该使用第三张表TeacherDepartments,您可以在其中存储TeacherIdDepartmentId
  • @AnkitBajpai 是的
  • @sgeddes 附加值将非常稀疏,例如 100 行中可能出现一次多个值
  • 我仍然建议使用第三张桌子。存储逗号分隔的列表可能很难恢复到它的描述......如果您出于某种原因真的不想要新表,您可以将多个 DepartmentId 列添加到您的 Teacher 表中,其中第二个是 @ 987654328@ 大部分时间。例如,teacherid, name, departmentid, departmentid2...

标签: sql postgresql database-design


【解决方案1】:
部门(部门代码 [PK],名称): 电子商务、电子 计算机科学、计算机科学 老师(TeacherId [PK]、姓名、部门列表): 123,老师1,CS 234,教师2,EC 345,老师3,[CS,EC]

没有。 Excel 电子表格中可能的内容在数据库表中是不可接受的。单列中的 CSV 是一个严重错误。它打破了第一范式和第二范式(E F Codd 博士定义):

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

  2. 每个域(属性)不能是一个集合(重复值)

CSV 是可分割的,它是一组重复值。如果您违反规则,您将没有可以轻松查询的数据库。你会有一桶鱼,这有时会奏效。

重复值存储在从属表中。这里是Associative Table,是Department 和Teacher 的下属。 PK 是一个组合,它是关系数据库中的标准票价。习惯它。该表不需要另一个 id 字段。

部门(部门代码 [PK],名称): 电子商务、电子 计算机科学、计算机科学 老师(TeacherId [PK],姓名): 123、老师1 234,老师2 345,老师3 TeacherDepartment(TeacherId,DeptCode) PK(教师编号,部门代码): 123, CS 234, 欧共体 345,CS 345,欧共体

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这里的teacher_id是主键,所以我不能为同一个teacher_id有多个值
    • 这是一个新表 Teacher_Department 表。
    • 由于数据很稀疏,就像多个数据在 100 或 200 行中出现一次一样,我不想将关系与教师表本身分开
    • 您寻求建议并得到了最好的建议:创建第三张表。条件仅出现在 100 行中的事实根本没有任何意义 - 每个查询都需要假设这种情况是 1。因此,要证明该表需要恰好出现 1 次。从长远来看,你会很高兴你做得对。但是,您可以忽略该建议。但从长远来看,如果是这样,您将付出代价。
    猜你喜欢
    • 1970-01-01
    • 2019-05-19
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多