0

TAXIS を所有し、所有者がタクシー会社にタクシーを提供する OWNERS がいます。タクシー会社にはドライバーがいます。TAXIS には 1 人以上のドライバーを割り当てることができ、ドライバーは複数のタクシーを運転できます。

これは、TAXIS と DRIVERS の間に多対多の関係があることを意味します。それは非常に簡単です。私の仮定では、タクシー会社は所有者、運転手、タクシーの記録を 3 つの異なるテーブル/エンティティ (OWNERS、TAXIS、DRIVERS) に保持しています。会社は、どのタクシーがどの所有者のもので、どのドライバーが運転しているかを知っています。

ひねりを加えたのは、所有者のほとんどが自分自身がドライバーであることです。この特定のものの関係をどのように作成する必要がありますか。

全体: エンティティのコンポーネントの 1 つが別のエンティティのコンポーネントにもなり得る場合の関連付け方法は? (ここでは、一部の所有者は運転手でもあります)

私はER図を作成し、後で正規化しようとしています。

4

2 に答える 2

0

これは、TAXIS から DRIVERS への 1 対多の関係があることを意味します。

本気ですか?タクシーが修理のために店にいるときはどうなりますか? その間、ドライバーは別のタクシーを運転できませんか? もしそうなら、実際にはここで多対多が必要です.DRIVERは多くのTAXISを運転でき、TAXIは1人以上のDRIVERSによって運転できます.

それを行う 1 つの方法は、コンポジションを使用することです。

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 つのテーブルを用意します。1 つはタクシーを所有していないドライバー用で、もう 1 つはタクシーを所有しているドライバー用です。これは多くの理由から悪いことです。たとえば、列は 2 つの個別のテーブルで繰り返され、特定のドライバーを見つけるには、ドライバーの検索を各テーブルで個別に実行する必要があります。これはお勧めしません。

  2. もう 1 つのオプションは、1 つのテーブルに所有者と非所有者を含む 1 つのテーブルを用意することです (下の図の呼び出し側)。次に、各タイプ (ドライバーのみ、所有者のみ、所有者とドライバー) の役割を追加できます。

以下のモデルはオプション 2 を表しています。アセットの割り当ては、特定のシフトで誰がどの車を運転しているかに関する情報を記録するために使用されます (必要に応じて、これをさらに具体化できます)。

ドライバーは「ドライバー所有者」になる可能性がありますが、モデルはこの変更を追跡していないことに注意してください。ただし、これにも対応するように拡張できます。 ここに画像の説明を入力

于 2013-12-28T05:50:29.167 に答える