如何在数据库中为可选的“返回票证”建模?

时间:2015-12-22 12:41:53

标签: sql database-design

以下是我的表格的总体布局:

  1. 我有一个包含一个或多个预订的order表。
  2. 我有reservation表连接到train和一个或多个tickets
  3. 我有一个train表,用于保存火车的信息,还有一个ticket表,用于表单。
  4. 我想要添加到系统的是返程票的概念,用户要求提供双程票。由于这些票有两个座位和票号等,我将不得不创建新票。火车也是如此;由于回程列车的信息不同,我将不得不创建两列火车:一列用于始发列车,另一列用于返回列车。

    这使我得出结论,这些实际上是两个不同的保留(它们也需要两次调用底层API)。换句话说,当有人购买双程票时,我需要创建两个预订,这两个预订连接到两个不同的列车,这些列车连接到与原始预订相同的票。

    当我想将这两个预订连接在一起时,问题就开始了。我正在寻找一个策略,让我知道这个预订是什么样的预订(起点与退货),以及其他预订是什么。例如,如果当前预订的ID为4并且是原始预订,我希望能够找到ID为5的预订,即预订。

    以下是我的想法和每个问题。

    方法一:originating_reservation_idreturn_reservation_id

    这是最简单的,但我认为是最糟糕的解决方案。在这种情况下,我将这两列添加到reservation表中。如果originating_reservation_id已填写,则此reservationreturn预订,否则为origination预订。明显的缺点是你获得了单程票的很多null值。

    方法二:中间表

    在这种情况下,我会有一个包含type字段,first_reservation_idsecond_reservation_id的表格。类型可以是origination,这意味着first_reservation_id是起源,second_reservation_id是返回。我也会在这个表中有另一行,这是相反的,这意味着对于每个双向票证,在此表中创建了两行。除了我为每个双向预留需要两行之外,布局似乎不直观。

    我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

这个问题最好通过添加另一个级别来解决,而不是在同一级别进行两次预留。

有一个存储每个预订的旅程表和一个 leg 表,用于存储属于该预订的每个旅行。旅程和腿有一对多的关系。单程旅行只有一条腿,返回会有两条腿。

除了解决问题之外,这还有其他好处。

  • 整个旅程和个人腿都有不同的信息,可能需要进行不同的查询。
  • 火车旅行可能有两条腿以上。简单的回程可能涉及更换火车(因此在每个方向上有多个座位预订)。这个设计现在可以处理这个要求,或者如果以后再介绍它。