0

有拥有 TAXIS 的业主,业主向出租车公司提供出租车。出租车公司有司机。TAXIS 可以分配一名或多名司机,司机可以驾驶多辆出租车。

这意味着 TAXIS 和 DRIVERS 之间会有多对多的关系。这很简单。根据我的假设,出租车公司将车主、司机和出租车的记录保存在三个不同的表/实体中——车主、出租车和司机。公司知道哪个出租车属于哪个车主,由哪个司机驾驶。

扭曲的是,大多数车主本身就是司机。我应该如何与这个特定的东西建立关系。

整体:当实体的一个组件也可以是另一个实体的组件时如何关联?(这里有些车主也是司机)

我正在尝试制作 ER 图,然后进行标准化。

4

2 回答 2

0

这意味着从 TAXIS 到 DRIVERS 会有一对多的关系。

你确定吗?出租车在店里维修时会发生什么?司机不能同时驾驶不同的出租车吗?如果是这样,您实际上想要多对多 - 一个 DRIVER 可以驱动许多 TAXIS,而 TAXI 可以由一个或多个 DRIVERS 驱动。

一种方法是组合。

public class Person
{
    public virtual Driver AsDriver { get; set; } // can be null (not a driver)
    public virtual Owner AsOwner { get; set; } // can be null (not an owner)
}

public class Driver
{
    // shares same primary key as Person
    public virtual Person AsPerson { get; set; } // cannot be null
    public virtual ICollection<Taxi> TaxisDriven { get; set; }
}

public class Owner 
{
    // shares same primary key as Person
    public virtual Person AsPerson { get; set; } // cannot be null
    public virtual ICollection<Taxi> TaxisOwned { get; set; }
}

public class Taxi
{
    public virtual ICollection<Driver> Drivers { get; set; }
    public virtual ICollection<Owner> Owners { get; set; }
}

var person = LoadSpecificPerson(personId);
var isBothOwnerAndDriver = person.AsDriver != null && person.AsOwner != null;
var drivesOwnTaxi = isBothOwnerAndDriver && person.AsOwner.TaxisOwned.Any(
    x => person.AsDriver.TaxisDriven.Select(y => y.TaxiId).Contains(x.TaxiId));
于 2013-12-28T04:52:38.267 回答
0

有2个选项:

  1. 有 2 个表来解决驱动程序。一种适用于不拥有出租车的司机,另一种适用于拥有出租车的司机。这很糟糕,原因有很多。例如,这些列将在 2 个单独的表中重复,并且必须在每个表上分别运行对驱动程序的搜索才能找到给定的驱动程序。我不推荐这个。

  2. 另一种选择是在 1 个表中包含 1 个包含所有者和非所有者的表(在下图中称为方)。然后,您可以为每种类型(仅驱动程序、仅所有者、所有者和驱动程序)添加一个角色。

下面的模型代表选项 2。资产分配用于记录有关谁在给定班次驾驶哪辆车的信息(如果您选择,您可以更多地充实它)。

请注意,驾驶员可能会成为“驾驶员所有者”,但模型不会跟踪此更改,但也可以对其进行扩展以适应这种情况。 在此处输入图像描述

于 2013-12-28T05:50:29.167 回答