实体关系 - 处理一段时间后过期关系的最佳方式

时间:2015-08-09 06:02:16

标签: database entity-framework entity-relationship

假设有一个Trip,每次旅行都会分配Bus

  • 因此Trip 有一个 Bus
  • Bus 有许多 Seats
  • 每个SeatBooking只有一个Trip

但如果您考虑多天,则每个Seat 都有很多 Booking

我的问题是在SeatBooking之间实现这种关系的最佳方式是什么?

例如:

我可以使用时间戳存储Booking。因此,当我想获得Seat的当前或下一次预订时,我可以使用日期进行过滤。但预订在旅行结束后到期,因此表格中会有很多过期的数据。

3 个答案:

答案 0 :(得分:3)

您所描述的是数据之间的时间关系。这非常棘手,并且非常难以保持约束的有效性和准确性,以确保数据的完整性。

在这种情况下听起来像是一个更好的解决方案就是不使用时间戳,而是使用行程号作为区分器。

这意味着您可以获得特定公交车特定行程的所有座位,或者如果您愿意,您可以在所有行程中获得所有座位。

答案 1 :(得分:2)

@Cobusve有正确的想法:BusSeat是具体对象;没有理由你不应该在他们的数据库中给他们一个相当永久的记录。 Trip并将Passenger s分配给Seat s给定的旅行(您给出了非常恰当的名称Booking的关系)都是抽象的,瞬态,概念。 (实际上,您应该考虑使用Passenger表,并将这些记录视为永久性记录,例如BusSeat。)

BusSeat明显具有0或1对多的关系(即,每个可以独立存在,Seat具有可空的外键BusId,并且在EF中, Bus有一个ICollection Seat,可能是空的,可以随时设置。在TripBooking之内,显然你会在你做任何预订之前设置一个旅行 - 你甚至可以提前做好旅行,为潜在的乘客提供即将到来的时间表开始接受预订。

现在,无论如何,Booking是什么?对于给定的Passenger,预订是Seat与特定Trip的关联:

class Booking
{
    public virtual Passenger Passenger { get; set; }
    public virtual Trip Trip { get; set; }
    public virtual Seat Seat { get; set; }
}

并将ICollection Booking添加到Trip。而已。按照惯例,EF 6会在Passenger上检测到TripSeatBooking作为外来关系,并会在Booking表上隐式创建外键它们。

您可以执行其他操作,使用[Required]或映射到(1)确保预订的主键是这三个外键的复合键(2)级联所有删除{{ 1}}与Booking相关联且Trip删除,但这回答了您询问TripBooking应该如何相关的原始问题。

特别是,关于自动删除旅行的计时器,你应该更加关注它:你可能想要以某种方式捕获旅行的细节 - 比如计费或审计 - 并且不想要当旅程的结束时间过去时,旅行就会从数据库中消失。

答案 2 :(得分:0)

您有旅行和旅行的详细信息(预订,巴士)。 我认为你的主要表是旅行,所以在旅行和公共汽车之间的旅行和预订之间的关系。 我认为您不需要直接预订和座位之间的关系。

当旅行日期到期时,意味着其他详细信息(预订和公共汽车)也将过期。