Un niño no puede tener más de 2 padres, ambos tienen roles específicos (madre vs. padre) y puede haber una situación en la que uno o ambos padres sean desconocidos.
Entonces, esta no es una relación real de "muchos a muchos", en realidad es "muchos a cero o uno o dos", que puede representarse naturalmente así (ambos MotherID
y FatherID
son compatibles con NULL):
Si pones LastName
en ambos Parent
y Player
(o una superclase común en su caso), esto también cubre naturalmente la situación en la que los padres tienen apellidos diferentes a los de sus hijos.
Luego puede obtener fácilmente "hijos por padre" 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
...y pivote los datos en el código de su aplicación si eso es lo que desea.
El modelo anterior permite la discrepancia entre Parent
El género y el rol de madre/padre. Si quieres evitar esto, puedes ir por la borda y hacer algo como esto...
...pero prefiero no complicarme y quedarme con el primer modelo y hacer cumplir esto a nivel de aplicación.