【问题标题】:Should I split this table into two?我应该把这张桌子一分为二吗?
【发布时间】:2010-12-12 11:13:09
【问题描述】:

我正试图围绕数据库规范化。这是我第一次尝试创建一个工作数据库,所以请原谅我的无知。我正在尝试为班级项目创建一个自动毕业检查系统。下表记录了指定目录年份的专业的所有选项。表格如下

PID    Title    Dept    Courses    Must_have

一些选项让用户从列出的总数中选择一组类别(因此有Must_have 属性)。一个完整的行看起来像这样:

PID    Title    Dept    Courses    Must_have
--------------------------------------------
 1      bis     acct    201|202      NULL

Title 是主要选项的名称。如果bis(业务信息系统)可以选择类,那么一行将在Must_have 中有一个数字,只有一行。

我的问题是我应该把这张表分成两个不同的表吗?我知道我目前的方式似乎有点……错了。任何帮助将不胜感激。

【问题讨论】:

  • 您能否举个例子来说明“一行在 Must_have 中只有一行会有一个数字。”
  • 如果一个选项需要 15 门课程中的 4 门课程,它看起来像这样:1 bis acct 201|202 4
  • 抱歉,请在 cmets 部分很好地格式化文本:\

标签: sql normalization


【解决方案1】:

我会把它分成三个表。第一个是majors,包含PID, Title, Dept,第二个是courses,包含课程ID、课程名称和任何其他信息,最后一个是专业和课程之间的映射(可能命名为@987654324 @)。 courses_majors 表将包含专业的 ID、课程的 ID 和一个标志,以显示该专业是否需要它。

(这是假设一门课程可以用于多个专业)

【讨论】:

  • 酷,非常感谢。我想我会像你描述的那样拆分我的桌子。
  • @nickf - 解决多对多问题对我们中的许多人来说似乎是一个重要的时刻。
  • 是的,我还记得有人第一次向我展示这种技术!
【解决方案2】:

我会将 dept 分解为一个单独的表并将其与数字 ID 相关联。然后将您的“课程”字段分解为“连接表”。像这样的:

专业

Id   Title       DepartmentID

专业课程

Id   MajorId     CourseId      MustHave

部门

Id   Title

所以,你可能有这样的专业:

1    bis          1

像这样的major_course:

1    1           201            0
1    1           202            0
1    1           203            1 -- must have 203

然后部门喜欢:

1    bis

所以现在,要获取第一个专业的课程列表,您可以这样做:

SELECT major_courses.CourseId, major_courses.MustHave, departments.Title 
FROM majors 
RIGHT JOIN major_courses ON major_courses.CourseId = majors.Id 
INNER JOIN departments ON departments.Id = majors.DepartmendID 
WHERE major.id = 1

【讨论】:

  • 我的数据库中有更多表应该处理与您描述的非常相似的专业。我希望我不必使选项表变得如此复杂,但看起来这是最好的方法。谢谢你的帮助:)
猜你喜欢
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2015-03-11
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多