Uma criança não pode ter mais de 2 pais, ambos têm papéis específicos (mãe vs. pai) e pode haver uma situação em que um ou ambos os pais são desconhecidos.
Portanto, este não é um relacionamento real "muitos para muitos", na verdade "muitos para zero ou um ou dois", que pode ser representado naturalmente assim (ambos
MotherID
e FatherID
são NULL-capazes):Se você colocar
LastName
em ambos Parent
e Player
(ou uma superclasse comum no seu caso), isso também abrange naturalmente a situação em que os pais têm sobrenomes diferentes dos filhos. Você pode facilmente obter "filhos por pai" como este (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
...e dinamize os dados no código do seu aplicativo, se for o que você deseja.
O modelo acima permite incompatibilidade entre
Parent
gênero e seu papel de mãe/pai. Se você quiser evitar isso, você pode ir ao mar e fazer algo assim ... ...mas prefiro não complicar e ficar com o primeiro modelo e aplicar isso no nível do aplicativo.