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

Entity Relationship - Best way to handle relationship that expires after time

假设有一个Trip,每个行程分配一个Bus

但是如果考虑多天,每个 Seat 有很多 Booking

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

例如:

我可以使用时间戳存储 Booking。因此,当我想获得 Seat 的当前或下一次预订时,我可以使用日期进行过滤。但是行程结束后预订就过期了,所以table.

里面会有很多过期的数据

您有行程和行程详细信息(预订、巴士)。 我认为您的主要 table 是旅行,所以旅行和预订之间的关系也应该是旅行和巴士之间的关系。 我认为您不需要预订和座位之间的直接关系。

当旅行日期到期时,这意味着其他详细信息(预订和巴士)也将到期。

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

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

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

@Cobusve 思路正确:BusSeat是具体对象;您没有理由不在您的数据库中为他们提供相当永久的记录。 Trip 和给定行程的 Passengers 到 Seats 的分配(你给哪个关系起了非常合适的名字 Booking)都是抽象的,瞬态,概念。 (实际上,您可能应该考虑 Passenger table,并将这些记录视为大部分永久记录,例如 BusSeat。)

BusSeat 显然具有 0 或 1 对多关系(即,每个都可以独立于另一个存在,Seat 具有可为空的外键 BusId,并且在EF,Bus 有一个 SeatICollection,它可能是空的)并且可以随时设置。在 TripBooking 中,显然您要在进行任何预订之前设置行程 – 您甚至可以提前创建行程,以便在您之前为潜在乘客提供即将到来的时间表开始接受预订。

现在,Booking 到底是什么?预订是 Passenger 与给定 Trip 的特定 Seat 的关联:

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

并将 BookingICollection 添加到 Trip。而已。按照惯例,EF 6 会将 PassengerTripSeat 检测为 Booking 上的外关系,并将在 Booking [= 上隐式创建外键60=] 给他们。

你可以做一些其他的事情,使用 [Required] 或映射到 (1) 确保预订的主键是这三个外键的组合键 (2) 级联所有的删除Bookings 与 Trip 关联并删除了 Trip,但这回答了您最初提出的关于 Bookings 和 Seats 应该如何处理的问题相关。

不过,特别是关于自动删除行程的计时器,您应该更加有意识:您可能希望以某种方式捕获行程的详细信息——比如用于计费或审计——并且不要不想让旅行在旅行结束时间过去后从数据库中消失。