实体关系 - 处理时间过后关系的最佳方式
Entity Relationship - Best way to handle relationship that expires after time
假设有一个Trip
,每个行程分配一个Bus
。
- 所以
Trip
有一个 Bus
.
- 一个
Bus
有很多Seats
.
- 每个
Seat
每个 Trip
有一个 Booking
。
但是如果考虑多天,每个 Seat
有很多 Booking
。
我的问题是在 Seat
和 Booking
之间实现这种关系的最佳方式是什么?
例如:
我可以使用时间戳存储 Booking
。因此,当我想获得 Seat
的当前或下一次预订时,我可以使用日期进行过滤。但是行程结束后预订就过期了,所以table.
里面会有很多过期的数据
您有行程和行程详细信息(预订、巴士)。
我认为您的主要 table 是旅行,所以旅行和预订之间的关系也应该是旅行和巴士之间的关系。
我认为您不需要预订和座位之间的直接关系。
当旅行日期到期时,这意味着其他详细信息(预订和巴士)也将到期。
您所描述的是数据之间的时间关系。这变得非常棘手非常快,并且很难保持约束的高效和准确以确保数据完整性。
在这种情况下,听起来更好的解决方案是不使用时间戳,而是使用行程编号作为区分器。
这意味着您可以在特定巴士的特定行程中获得所有座位,或者如果您愿意,您可以在所有行程中获得所有座位。
@Cobusve 思路正确:Bus
和Seat
是具体对象;您没有理由不在您的数据库中为他们提供相当永久的记录。 Trip
和给定行程的 Passenger
s 到 Seat
s 的分配(你给哪个关系起了非常合适的名字 Booking
)都是抽象的,瞬态,概念。 (实际上,您可能应该考虑 Passenger
table,并将这些记录视为大部分永久记录,例如 Bus
和 Seat
。)
Bus
和 Seat
显然具有 0 或 1 对多关系(即,每个都可以独立于另一个存在,Seat
具有可为空的外键 BusId,并且在EF,Bus
有一个 Seat
的 ICollection
,它可能是空的)并且可以随时设置。在 Trip
和 Booking
中,显然您要在进行任何预订之前设置行程 – 您甚至可以提前创建行程,以便在您之前为潜在乘客提供即将到来的时间表开始接受预订。
现在,Booking
到底是什么?预订是 Passenger
与给定 Trip
的特定 Seat
的关联:
class Booking
{
public virtual Passenger Passenger { get; set; }
public virtual Trip Trip { get; set; }
public virtual Seat Seat { get; set; }
}
并将 Booking
的 ICollection
添加到 Trip
。而已。按照惯例,EF 6 会将 Passenger
、Trip
和 Seat
检测为 Booking
上的外关系,并将在 Booking
[= 上隐式创建外键60=] 给他们。
你可以做一些其他的事情,使用 [Required]
或映射到 (1) 确保预订的主键是这三个外键的组合键 (2) 级联所有的删除Booking
s 与 Trip
关联并删除了 Trip
,但这回答了您最初提出的关于 Booking
s 和 Seat
s 应该如何处理的问题相关。
不过,特别是关于自动删除行程的计时器,您应该更加有意识:您可能希望以某种方式捕获行程的详细信息——比如用于计费或审计——并且不要不想让旅行在旅行结束时间过去后从数据库中消失。
假设有一个Trip
,每个行程分配一个Bus
。
- 所以
Trip
有一个Bus
. - 一个
Bus
有很多Seats
. - 每个
Seat
每个Trip
有一个Booking
。
但是如果考虑多天,每个 Seat
有很多 Booking
。
我的问题是在 Seat
和 Booking
之间实现这种关系的最佳方式是什么?
例如:
我可以使用时间戳存储 Booking
。因此,当我想获得 Seat
的当前或下一次预订时,我可以使用日期进行过滤。但是行程结束后预订就过期了,所以table.
您有行程和行程详细信息(预订、巴士)。 我认为您的主要 table 是旅行,所以旅行和预订之间的关系也应该是旅行和巴士之间的关系。 我认为您不需要预订和座位之间的直接关系。
当旅行日期到期时,这意味着其他详细信息(预订和巴士)也将到期。
您所描述的是数据之间的时间关系。这变得非常棘手非常快,并且很难保持约束的高效和准确以确保数据完整性。
在这种情况下,听起来更好的解决方案是不使用时间戳,而是使用行程编号作为区分器。
这意味着您可以在特定巴士的特定行程中获得所有座位,或者如果您愿意,您可以在所有行程中获得所有座位。
@Cobusve 思路正确:Bus
和Seat
是具体对象;您没有理由不在您的数据库中为他们提供相当永久的记录。 Trip
和给定行程的 Passenger
s 到 Seat
s 的分配(你给哪个关系起了非常合适的名字 Booking
)都是抽象的,瞬态,概念。 (实际上,您可能应该考虑 Passenger
table,并将这些记录视为大部分永久记录,例如 Bus
和 Seat
。)
Bus
和 Seat
显然具有 0 或 1 对多关系(即,每个都可以独立于另一个存在,Seat
具有可为空的外键 BusId,并且在EF,Bus
有一个 Seat
的 ICollection
,它可能是空的)并且可以随时设置。在 Trip
和 Booking
中,显然您要在进行任何预订之前设置行程 – 您甚至可以提前创建行程,以便在您之前为潜在乘客提供即将到来的时间表开始接受预订。
现在,Booking
到底是什么?预订是 Passenger
与给定 Trip
的特定 Seat
的关联:
class Booking
{
public virtual Passenger Passenger { get; set; }
public virtual Trip Trip { get; set; }
public virtual Seat Seat { get; set; }
}
并将 Booking
的 ICollection
添加到 Trip
。而已。按照惯例,EF 6 会将 Passenger
、Trip
和 Seat
检测为 Booking
上的外关系,并将在 Booking
[= 上隐式创建外键60=] 给他们。
你可以做一些其他的事情,使用 [Required]
或映射到 (1) 确保预订的主键是这三个外键的组合键 (2) 级联所有的删除Booking
s 与 Trip
关联并删除了 Trip
,但这回答了您最初提出的关于 Booking
s 和 Seat
s 应该如何处理的问题相关。
不过,特别是关于自动删除行程的计时器,您应该更加有意识:您可能希望以某种方式捕获行程的详细信息——比如用于计费或审计——并且不要不想让旅行在旅行结束时间过去后从数据库中消失。