子供は2人以下の親を持つことができ、両方が特定の役割(母親と父親)を持ち、一方または両方の親が不明な状況が発生する可能性があります。
したがって、これは実際の「多対多」の関係ではなく、実際には「多対0または1つまたは2つ」であり、このように自然に表すことができます(MotherID
およびFatherID
NULL可能):
LastName
を入力した場合 両方のParent
およびPlayer
(またはあなたの場合は一般的なスーパークラス)、これは当然、親が子供とは異なる家系の名前を持っている状況もカバーします。
次に、このように「親ごとの子」を簡単に取得できます( SQL Fiddle )...
SELECT
ParentID,
Parent.FirstName ParentFirstName,
Parent.LastName ParentLastName,
PlayerID,
Player.FirstName PlayerFirstName,
Player.LastName PlayerLastName
FROM
Parent
LEFT JOIN Player
ON Parent.ParentID = Player.MotherID
OR Parent.ParentID = Player.FatherID
ORDER BY ParentId
...必要に応じて、アプリケーションコードのデータをピボットします。
上記のモデルでは、Parent
間の不一致が許容されます の性別とその母親/父親の役割。これを防ぎたい場合は、船外に出てこのようなことをすることができます...
...しかし、私は複雑にせず、最初のモデルに固執して、アプリケーションレベルでこれを実施したいと思います。