Database 实体关系-处理过期关系的最佳方法

Database 实体关系-处理过期关系的最佳方法,database,entity-framework,entity-relationship,Database,Entity Framework,Entity Relationship,假设有一个行程,为每次行程分配一个总线 所以一个行程有一个总线 一辆公共汽车有许多座位 每个座位每个行程都有一个预订 但是,如果您考虑多天,每个阀座< /代码>有许多预订< /代码>。p> 我的问题是,实现座位和预订之间关系的最佳方式是什么 例如: 我可以使用时间戳存储预订。因此,当我想获得座位的当前或下一次预订时,我可以使用日期进行筛选。但是预订在旅行后过期,因此表中会有很多过期数据。您有旅行和旅行详细信息(预订、公交车)。 我认为你们的主桌是旅行,所以旅行和预订之间的关系也应该是旅行和公

假设有一个
行程
,为每次行程分配一个
总线

  • 所以一个
    行程
    有一个
    总线
  • 一辆
    公共汽车
    有许多
    座位
  • 每个
    座位
    每个
    行程都有一个
    预订

但是,如果您考虑多天,每个<代码>阀座< /代码>有许多<代码>预订< /代码>。p> 我的问题是,实现

座位
预订
之间关系的最佳方式是什么

例如:


我可以使用时间戳存储
预订
。因此,当我想获得
座位的当前或下一次预订时,我可以使用日期进行筛选。但是预订在旅行后过期,因此表中会有很多过期数据。

您有旅行和旅行详细信息(预订、公交车)。 我认为你们的主桌是旅行,所以旅行和预订之间的关系也应该是旅行和公交车之间的关系。 我想你们不需要在预订和座位之间建立直接的关系


当旅行日期到期时,意味着其他细节(预订和巴士)也将到期

您有旅行和旅行详细信息(预订、公交车)。 我认为你们的主桌是旅行,所以旅行和预订之间的关系也应该是旅行和公交车之间的关系。 我想你们不需要在预订和座位之间建立直接的关系


当旅行日期到期时,意味着其他细节(预订和巴士)也将到期

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

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


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

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

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


这意味着你可以为一辆特定的巴士获得一次特定旅程的所有座位,或者如果你愿意,你可以在所有旅程中获得所有座位。

@Cobusve有一个正确的想法:
bus
Seat
是具体的对象;没有理由不在数据库中为它们提供一个相当永久的记录<代码>行程
和为给定行程将
乘客
分配到
座位
s都是抽象的、暂时的概念(您给了非常合适的名称
预订
)。(实际上,您应该考虑一下<代码>乘客<代码>表,并将这些记录视为永久性的,如“代码>总线< /代码>和<代码>座位< /代码>)

Bus
Seat
显然有一个0或1对多的关系(即,每一个都可以独立存在,
Seat
有一个可为空的外键BusId,而在EF中,
Bus
有一个
Seat
ICollection
,可以随时设置。在
行程
预订
中,很明显,您将在预订行程之前设置行程–您甚至可以提前创建行程,以便在开始预订之前为潜在乘客提供即将到来的日程安排

现在,什么是
预订
?预订是给定
行程的
乘客
与特定
座位
的关联:

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将检测
乘客
行程
座位
预订
上的外键,并在
预订
表中为其隐式创建外键

您可以使用
[Required]
或映射来执行其他操作:(1)确保预订的主键是这三个外键的组合键(2)将与
行程相关的所有
预订的删除与该
行程的删除级联,但这回答了您最初提出的关于
预订
s和
座位
s应该如何关联的问题


特别是,关于自动删除行程的计时器,你应该更仔细地考虑一下:很可能你想以某种方式捕捉旅行的细节——比如账单或审计——并且不想在旅行结束时旅行从数据库中消失。

@Cobusve有一个正确的想法:
Bus
Seat
是具体的对象;没有理由不在数据库中为它们提供一个相当永久的记录<代码>行程
和为给定行程将
乘客
分配到
座位
s都是抽象的、暂时的概念(您给了非常合适的名称
预订
)。(实际上,您应该考虑一下<代码>乘客<代码>表,并将这些记录视为永久性的,如“代码>总线< /代码>和<代码>座位< /代码>)

Bus
Seat
显然有一个0或1对多的关系(即,每一个都可以独立存在,
Seat
有一个可为空的外键BusId,而在EF中,
Bus
有一个
Seat
ICollection
,可以随时设置。对于
Trip
Booking
,很明显,您将在预订任何行程之前设置行程–您甚至可以提前创建行程,为潜在乘客提供即将到来的行程安排