假设有一个Trip
,每次旅行都会分配Bus
。
Trip
有一个 Bus
。Bus
有许多 Seats
。Seat
每Booking
只有一个Trip
。但如果您考虑多天,则每个Seat
都有很多 Booking
。
我的问题是在Seat
和Booking
之间实现这种关系的最佳方式是什么?
例如:
我可以使用时间戳存储Booking
。因此,当我想获得Seat
的当前或下一次预订时,我可以使用日期进行过滤。但预订在旅行结束后到期,因此表格中会有很多过期的数据。
答案 0 :(得分:3)
您所描述的是数据之间的时间关系。这非常棘手,并且非常难以保持约束的有效性和准确性,以确保数据的完整性。
在这种情况下听起来像是一个更好的解决方案就是不使用时间戳,而是使用行程号作为区分器。
这意味着您可以获得特定公交车特定行程的所有座位,或者如果您愿意,您可以在所有行程中获得所有座位。
答案 1 :(得分:2)
@Cobusve有正确的想法:Bus
和Seat
是具体对象;没有理由你不应该在他们的数据库中给他们一个相当永久的记录。 Trip
并将Passenger
s分配给Seat
s给定的旅行(您给出了非常恰当的名称Booking
的关系)都是抽象的,瞬态,概念。 (实际上,您应该考虑使用Passenger
表,并将这些记录视为永久性记录,例如Bus
和Seat
。)
Bus
和Seat
明显具有0或1对多的关系(即,每个可以独立存在,Seat
具有可空的外键BusId,并且在EF中, Bus
有一个ICollection
Seat
,可能是空的,可以随时设置。在Trip
和Booking
之内,显然你会在你做任何预订之前设置一个旅行 - 你甚至可以提前做好旅行,为潜在的乘客提供即将到来的时间表开始接受预订。
现在,无论如何,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
上检测到Trip
,Seat
和Booking
作为外来关系,并会在Booking
表上隐式创建外键它们。
您可以执行其他操作,使用[Required]
或映射到(1)确保预订的主键是这三个外键的复合键(2)级联所有删除{{ 1}}与Booking
相关联且Trip
删除,但这回答了您询问Trip
和Booking
应该如何相关的原始问题。
特别是,关于自动删除旅行的计时器,你应该更加关注它:你可能想要以某种方式捕获旅行的细节 - 比如计费或审计 - 并且不想要当旅程的结束时间过去时,旅行就会从数据库中消失。
答案 2 :(得分:0)
您有旅行和旅行的详细信息(预订,巴士)。 我认为你的主要表是旅行,所以在旅行和公共汽车之间的旅行和预订之间的关系。 我认为您不需要直接预订和座位之间的关系。
当旅行日期到期时,意味着其他详细信息(预订和公共汽车)也将过期。