何时在SQL中拆分表?

时间:2018-09-17 14:28:35

标签: sql database-design

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

我正在看一个演讲,讲师有一个“客户”表,而其中一列是“城市”,许多客户来自同一城市,因此数据是多余的。然后,他将“城市”分解为自己的桌子,但这对我来说意义不大。

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

我还有其他几列,例如“星期几”,“位置”,“上课时间”,它们也只有一些经常重复的值。应该将它们分解到自己的单独表中还是留在“课程”表中?

2 个答案:

答案 0 :(得分:1)

学习数据库时,这总是很棘手。规范化规则可能会有所帮助,但不清楚何时应用它们。

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

对于您的具体问题:

  • “学时”似乎更像是课程实体的属性。什么时候可以成为自己的实体?好吧,如果他们还有其他与学时相关的信息。很难举例说明,但例如:费用,生效日期范围,抵免额适用的部门。
  • “星期几”。如果这是一个日期,则只需使用一个日期,然后使用数据库功能为该日期或日历表导出星期几即可。
  • “星期几”进行安排。这个比较棘手。有多种表示方法。最好的表示方式取决于其使用方式。
  • “位置”。这听起来像一个实体。它可以具有名称,地址,联系方式,方向和其他信息。实际上,可以有多个实体来支持这一点。
  • “上课时间”。这可能是课程的一个属性,带有开始时间和结束时间。

答案 1 :(得分:0)

考虑使用课程表和时间表表。这样一来,您可以选择一门课程,而且时间表会有所不同,而且时间表会在一周中的不同时间和日期。如果有不同的位置,我会将位置移到进度表中。正确设置时间格式,以便您可以计算持续时间并在需要时进行投放。这取决于数据的外观。

课程

  • PK课程ID(int)
  • credit_hours(int)
  • 位置(varchar)

      |
    

    (一对多关系)

      |
    

时间表

  • PK schedule_ID(int)
  • FK课程ID(int)
  • day_of_week(varchar)
  • 开始时间(varchar)
  • end_time(varchar)