火车时刻表的 MySQL 数据库架构

Vic*_*sig 7 mysql schema database-design

我对 MySQL 数据库模式对于火车时刻表的外观感兴趣。

通常,这以表格形式呈现为最终结果。

Train No.    11111  22222  11111
Train Day    Mo-Fr  Sat    Sun
Station A  d 06.00  07.00  07.00
Station B  d 06.10         07.10
Station C  d 06.20  07.15   
Station D  a 06.30         07.40
Station D  d 06.35  07.25
Station E  d 06.45  07.45
Run Code Online (Sandbox Code Playgroud)

所以每列火车都有一个火车编号,但这不是唯一的,因为该编号将在周一至周五到周六和周日重复。然后一列火车会停在多个车站,但不是所有车站,有时车站需要到达 (a) 和出发 (d) 时间,或其中之一。

车站可以按距离排序。

到目前为止,我认为我需要表格:

  • 车站(ID、名称、距离、线路)
  • 火车(ID、火车编号、日间运营、详细信息)
  • 火车运行(Train.ID、Station.ID、arr/dep、time、notes)

这是否足够规范化?

  • 应该说周一至周五的火车 11111 只是一个包含大量日间操作组合的条目,即 7 列(M、T、W、Th、F、S、Su)?
  • 难道它不也应该处理只在一个日期运行并且每周不重复的一次性火车吗?

Chr*_*xon 7

我会强烈考虑明确存储特定计划实际运行的所有日子。这将给出一个看起来像这样的结构:

在此处输入图片说明

通过这样做,您可以更轻松地回答诸如“10 月 1 日前往 X 站的所有火车是什么?”等问题。当火车没有运行(例如圣诞节)时,它还可以识别“临时间隔”。一次性火车现在只是在 SCHEDULE_DAYS 中只有一个条目的火车。

由于周末和工作日的日程安排可能不同,我认为最好每天都有单独的行。如果您需要这样做,这允许链接一周中每一天的不同时间表。


Bil*_*hor 1

您可以通过设置首次运行和终止(不再运行的第一个日期)的日期字段来处理一次性运行。这也将允许您处理日程安排的更改。首次运行日期成为主键的一部分。您可能需要此表上的关系表的代理主键。

我会考虑将一周中的几天分成七个单独的指标字段。这使您可以灵活地处理仅在一周中的某些日子运行的计划。火车站与车站的关系可以简化为(火车、车站、类型(到达/出发)一天中的时间)。音符可以根据它们的密度进入单独的关系。