何时在SQL中拆分表?

问题描述 投票:-1回答:2

我对SQL比较陌生并试图自学,我很难理解何时保留一个列以及何时将其分成新表。

我正在观看讲座,讲师有一个“客户”表,其中一个栏目是“城市”,很多客户来自同一个城市,所以数据是多余的。然后,他把“城市”分成了自己的桌子,但这对我来说没有多大意义。

例如,我正在创建一个大学课程数据库,我注意到“课程”维度中的某些列经常重复(如学分)。我应该将信用时间分解到自己的表中,那个表只有几行吗?这取得了什么成果?我仍然需要使用外键为每个新数据条目引用相同的值,这样它甚至可以节省存储空间还是只是一个不必要的连接?

我还有其他专栏,比如'Days of Week','Location','Class Time',它也只有一些经常重复的值。那些应该分解到他们自己的单独表中还是留在Course表的一部分?

sql database-design
2个回答
1
投票

在学习数据库时,这总是很棘手。规范化规则可以提供帮助,但是他们可能不清楚何时应用它们。

这个想法是(某些)数据库表代表“实体”。这些是您想要存储信息的内容。其他表格表示实体之间的关系,但现在不要担心这些关系。

针对您的具体问题:

  • “信用小时似乎更像是课程实体的一个属性。他们什么时候才能成为他们自己的实体?好吧,如果他们有其他信息特定于学分时间。很难提出例子,但例如:成本,范围有效日期,学分适用的部门。
  • “休息日的周”。如果这是一个日期,那么只需使用日期并使用数据库函数为日期或日历表派生星期几。
  • 用于安排的“星期几”。这个比较棘手。有多种方式来表示这一点;最佳表示取决于它的使用方式。
  • “地点”。这听起来像一个实体。它可以有姓名,地址,联系方式,指示和其他信息。事实上,可能有不止一个实体来支持这一点。
  • “上课时间”。这可能是课程的一个属性,包括开始时间和结束时间。

0
投票

考虑使用课程表和计划表。通过这种方式,您可以拥有一个课程,其中包含许多不同的时间表,这些课程有不同的时间和星期几。如果有不同的位置,我会将位置移动到计划表中。正确格式化时间,以便您可以计算持续时间并在需要时投射它们。这取决于数据的样子。

课程

  • PK course_ID(int)
  • credit_hours(int)
  • location(varchar) | (一对多关系) |

时间表

  • PK schedule_ID(int)
  • FK course_ID(int)
  • day_of_week(varchar)
  • start_time(varchar)
  • end_time(varchar)
© www.soinside.com 2019 - 2024. All rights reserved.