旅行时间表数据库设计

时间:2016-02-09 13:09:08

标签: database-design relational-database

我正在研究旅行时间表系统。特定目的地至少有三(3)个出发时间。这些出发时间根据日期类型(峰值或非峰值)而变化。以下是我当前设计的描述:

DepartureTable

目的地| time1 | time2 | time3 | day_type

- >所需的输出将显示在如下表格中:

routeABC | 6:30 | 6:45 | 6:50 | peak
routeABC | 6:40 | 7:00 | 8:45 | non-peak
routeXYZ | 7:00 | 7:30 | 7:40 | peak

请通过1NF测试(我怀疑是因为重复的列名)?

1 个答案:

答案 0 :(得分:0)

这可能是你希望的答案。

您的输出

routeABC | 6:30 | 6:45 | 6:50 | peak

包含的信息比您想象的要多。

交通系统包括车站,车辆,出发时间,路线和航线起飞时间。

让我们先取站。我们将创建一个Station表。

Station
-------
Station ID
Station Name
Station Address
...

通常,表名是单数。 Station ID是一个无意义的数字,通常是一个自动递增的整数,它在内部标识表中的行。另一个名字是盲键。 Station ID是Station表的主键。

Station表中的所有信息都与电台有关。这是第三种正常形式。查看表格是否处于第三范式的简便方法是问自己这个问题。

  

数据是否与密钥,整个密钥以及密钥有关,请帮助我Codd?

关键是第一种正常形式。

整个关键是第二范式。

除了关键是第三范式之外别无其他。

车辆

接下来,我们将查看Vehicle表。

Vehicle
-------
Vehicle ID
Vehicle Type (Bus, Light Rail, Heavy Rail, etc.)
Vehicle VIN
Vehicle License Plate
...

车辆ID是主键。它是一个自动递增的整数。它可以与我们之前谈到的Station ID具有相同的值。但是,这些相同的值表示数据库中的不同行。

出发时间

每个车站有一个或多个出发时间。在你的问题中,你提到了3个出发时间。通过规范化数据库,您可以允许超过3个出发时间。

让我们看看出发时间表。

Departure Time
--------------
Departure Time ID
Departure Time Stamp.
Station ID

主键是Departure Time ID,一个自动递增的整数。对于不同的出发时间标记,可以重复相同的站ID。该表还有一个索引(车站ID,出发时间戳DESCending)。

路线

我们创建了三个表,车站,车辆和出发时间。这些表称为域表,因为它们描述了我们域中的对象。车站和车辆是物理对象。出发时间不是物理的,但它仍然是一个对象。

让我们来看一下路线表。

Route
-----
Route ID
Vehicle ID
Route Type (Peak, Non-peak, etc.)

路由ID是主键,是一个自动递增的整数。车辆ID是来自Vehicle表的盲密钥。使用盲键,我们创建从Route表到Vehicle表的关系。

路线有一辆车。路线有一种类型。

路线出发时间

路线有一个或多个出发时间。

让我们看一下路线离港表。

Route Departure Table
---------------------
Route ID
Departure Time ID
Departure Time Sequence

主键是(路线ID,出发时间序列)。我们需要两列来创建唯一的主键。

路径ID是路由表中的盲密钥。

出发时间ID是出发时间表中的盲密钥。

出发时间序列是一个整数,在排序时,按顺序给出出发时间。这是因为路线可以在午夜过后。

结论

我希望您不要将此视为过于复杂的解决方案。我们对数据库进行规范化的原因是我们不会复制数据,我们可以混合和匹配数据以获得不同的输出。公交车司机的时间表看起来不同,与公交车骑手的时间表不同。