【问题标题】:ENTITY RELATION ? How to relate when one of the component of entity can be the component of another entity too?实体关系?当实体的一个组件也可以是另一个实体的组件时,如何关联?
【发布时间】:2014-01-15 15:46:03
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这是规定的表结构,还是可以更改?

标签: sql entity-framework database-design er-diagrams er-diagram


【解决方案1】:

这意味着 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));

【讨论】:

  • 感谢您指出这一点。 TAXI和DRIVER之间实际上应该是多对多的关系。我已经编辑了我的问题。我正在尝试从中制作 ER 图,然后再进行规范化。我不太熟悉你试图让我理解的方式。 (对此感到抱歉,因为我没有在我的问题本身中提到我将要做什么。)。但是您确实指出了我问题中的错误。
【解决方案2】:

有两种选择:

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

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

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

请注意,驱动程序可能会成为“驱动程序所有者”,但模型不会跟踪此更改,但也可以对其进行扩展以适应这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2013-05-10
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多