gpt4 book ai didi

mysql - 数据库设计——多个外键

转载 作者:搜寻专家 更新时间:2023-10-30 20:46:54 25 4
gpt4 key购买 nike

我的数据库包含学校、部门和类(class)。一个学校可能有也可能没有分部,一个类(class)与一个学校有关,也可能与一个分部有关也可能不相关(学校可能没有分部,也可能类(class)交叉分部)

我的表目前设置如下:

学校:

ID       | name
--------------------
harvard | Harvard University
mit | MIT
ucla | UCLA

(id+school=unique)

ID  | school (FK) | name
------------------------------------------
eng | harvard | School of Engineering
arc | harvard | School of Architecture
eng | UCLA | UCLA Engineering

类(class):

ID | school (FK) | division | name
-------------------------------------------------
1 | harvard | eng | Intro to Engineering
2 | harvard | arc | Intro to Architecture
3 | harvard | | Statistics
4 | mit | | Math

我对此的担忧:

  • 没有验证来确保 course 中的部门存在并且与学校相关。
  • 除法实际上不是fk
  • 需要两次查询才能得到学校和部门

有更好的方法吗?我希望能够:

  • 查询所有“harvard”类(class)
  • 查询所有“哈佛工程”类(class)
  • 查询所有“harvard engineering and harvard general”类(class)

最佳答案

如果总是可以创建复合外键。但是,我建议对您的设计进行以下更改:

  • 为每所学校创建一个名为“General”的默认部门
  • 允许同一类(class)存在于不同学校的可能性(在现实生活中,这可能会发生)。

此外,我建议对所有表使用自动递增的整数主键,而不是依赖于手动构建的名称。

考虑以下遵循上述原则的设计:

school
id primary key
name

division
id primary key
school_id foreign key to school(id)
name

course
id primary key
name

course_division
id primary key
course_id foreign key to course(id)
division_id foreign key to division(id)

现在这里是使用这个模式的查询。

查询所有“harvard”类(class)

SELECT c.* 
FROM course c
INNER JOIN division d ON d.id = cd.division_id
INNER JOIN school s ON s.id = d.school_id AND s.name = 'Harvard University'

查询所有“harvard engineering”类(class)

SELECT c.* 
FROM course c
INNER JOIN course_division cd ON cd.id = c.course_id
INNER JOIN division d ON d.id = cd.division_id AND d.name = 'School of Engineering'
INNER JOIN school s ON s.id = d.school_id AND s.name = 'Harvard University'

查询所有“harvard engineering and harvard general”类(class)

SELECT c.* 
FROM course c
INNER JOIN course_division cd ON cd.id = c.course_id
INNER JOIN division d ON d.id = cd.division_id AND d.name IN ('School of Engineering', 'General')
INNER JOIN school s ON s.id = d.school_id AND s.name = 'Harvard University'

关于mysql - 数据库设计——多个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58313105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com