Database design 两个地点的ERD

Database design 两个地点的ERD,database-design,erd,Database Design,Erd,我正在设计一个数据库,遇到了这个问题: 我的案例是设计一个ERD来跟踪汽车及其在不同地点之间的移动 用户使用一个包含三个字段的表单:第一个字段用于进入汽车。第二个字段用于输入车辆来自的位置(从位置) 第三个字段是输入汽车要去的位置(to_位置) 例如,汽车1正在从位置A移动到位置B。另一个例子是,汽车2正在从位置B移动到位置A 如何创建位置表并将其连接到汽车表,以便它覆盖从和到 这种关系应该是多对多的 我希望问题足够清楚。汽车和位置之间的关系是:每辆汽车有两个位置(从和到),每个位置有0..n辆

我正在设计一个数据库,遇到了这个问题:

我的案例是设计一个ERD来跟踪汽车及其在不同地点之间的移动

用户使用一个包含三个字段的表单:第一个字段用于进入汽车。第二个字段用于输入车辆来自的位置(从位置) 第三个字段是输入汽车要去的位置(to_位置)

例如,汽车1正在从位置A移动到位置B。另一个例子是,汽车2正在从位置B移动到位置A

如何创建位置表并将其连接到汽车表,以便它覆盖从和到

这种关系应该是多对多的


我希望问题足够清楚。

汽车和位置之间的关系是:每辆汽车有两个位置(从和到),每个位置有0..n辆汽车。
您应该:使用字段创建Car表:LocationFrom和LocationTo每个字段都是具有LocationId和LocationName的表位置的外键(您只能有后者,这是有争议的)。
为什么不需要第三个表:连接不是多对多-而是两对多。
当您有一个真正的多对多关系时,表无法分辨一个表中的哪个记录对应另一个表中的哪个记录,因此需要第三个表(试一试..例如,如果您要保存每辆车的所有位置-这将是一个多对多关系,因为现在一辆车与0..n个位置相关,而一个位置与0..n辆车相关。现在,您将如何判断哪个汽车记录与哪个位置相关(你们可以有n列,但这是不合理的,所以你们需要另一个表)无论如何,你们在car中只有两列和位置“直接”相关

添加:
因此,您还需要历史记录……在这种情况下,您确实需要一个额外的表。
我会在我的原始解决方案中添加一列,这样现在表car就有了列:
Id、FromLocation、ToLocation、LocationHistoryId
FromLocation和ToLocation保持不变,LocationHistoryId是具有以下列的表LocationHistory的外键:
CarId,位置ID

其中,键是一个复合键,包含两个字段(显然LocationId指向Location table)

我将有三个表

  • 汽车
  • 位置
  • 定位
Car将具有适当的Car信息

  • 龋齿
  • 名字
  • 颜色
  • 制造
  • 模型
位置将只是一个字段,除非您想添加横向/纵向信息等

  • 位置ID
  • 地点名称
  • 纬度
  • 经度
CarLocation至少包括四个字段

  • CarLocationId
  • 龋齿
  • FromLocationId
  • ToLocationId

我可能会在CarLocation表中包含一个UpdateTimestamp字段。

因此,在这种情况下,两个字段(LocationFrom和LocationTo)将引用一个键,即locationID?但我如何确保From和to的数据不相同?例如,记录车(car#1,1,1)不可能发生,因为一辆车不可能从一个地方同时到达同一个地方。你明白我的意思吗?还有,我需要第三个连接表吗?因为这个关系似乎是多对多的。是的,我明白你的意思。这个AFAIK不能通过ERD看到,但你应该把它作为一个注释来写。@Oren,当车移动时从位置B到位置C,您会丢失这些信息。@Guest1,您想保留该车所有人的历史记录吗?@Nathan,是的,我想保留历史记录。感谢您的快速回复!这引发了两个问题:如果用户在“发件人”字段和“收件人”字段中放置到相同的位置,会怎么样?这将使我的表成为“CarLocation”要获得以下无效记录:CarLocation(1,1,3,3)。位置3与位置3相同,这是错误的。我们不能让一辆车从某个位置驶向该位置。对吗?@guest,您应该在前端包含逻辑,以确保不会发生这种情况