Ayuda. Consultas

Mart?
14 de Junio del 2006
Buenas a todos,

Voy a intentar explicaros un poco como funciona la base de datos que intento hacer, para ver si alguien me echa un cable.

Tengo una tabla de 'pilotos' y otra de 'privilegios'. Entre ellas hay una relación M->N, pero también se relacionan entre ellas mediante otras tablas, que pueden ser la de 'grupo','directiva','rango'y'flota'.

Intentaré explicarlo mediante el siguiente esquema:

piloto(M)<->privilegio(N)

piloto(1)->directiva(N)
directiva(M)<->privilegio(N)

piloto(M)<->grupo(N)
grupo(M)<->privilegio(N)

privilegio(M)<->rango(N)
rango(1)->piloto(N)

piloto(M)<->flota
flota(M)<->privilegio(N)


Mi pregunta es, ¿que es mejor, cruzar sólo la tabla 'piloto' con la de 'privilegio', o hacer una consulta que las relacione mediante todas las anteriores?
He intentado hacer una consulta que las relacione todas, pero no ha tenido éxito:

SELECT piloto.piloto_numero, piloto.piloto_id, c_piloto_flota.piloto_id, c_piloto_flota.flota_id, c_flota_privilegio.flota_id, c_flota_privilegio.privilegio_id, privilegio.privilegio_id, privilegio.privilegio_codigo
FROM privilegio, c_grupo_privilegio, c_piloto_grupo, c_piloto_privilegio, c_rango_privilegio, piloto, c_directiva_privilegio, directiva, c_flota_privilegio, c_piloto_flota
WHERE privilegio.privilegio_codigo = 'ZonaPrivada'
AND (
(
privilegio.privilegio_id = c_grupo_privilegio.privilegio_id
AND c_grupo_privilegio.grupo_id = c_piloto_grupo.grupo_id
AND c_piloto_grupo.piloto_id = piloto.piloto_id
)
OR (
privilegio.privilegio_id = c_piloto_privilegio.privilegio_id
AND c_piloto_privilegio.piloto_id = piloto.piloto_id
)
OR (
privilegio.privilegio_id = c_rango_privilegio.privilegio_id
AND c_rango_privilegio.rango_id = piloto.rango_id
)
OR (
privilegio.privilegio_id = c_directiva_privilegio.privilegio_id
AND c_directiva_privilegio.directiva_id = directiva.directiva_id
AND directiva.piloto_id = piloto.piloto_id
)
OR (
privilegio.privilegio_id = c_flota_privilegio.privilegio_id
AND c_flota_privilegio.flota_id = c_piloto_flota.flota_id
AND c_piloto_flota.piloto_id = piloto.piloto_id
)
)
AND piloto.piloto_numero = '101'

He mirado el EXPLAIN, y creo que el problema está aquí:

1 SIMPLE c_piloto_privilegio index PRIMARY PRIMARY 8 NULL 2 Using where; Using index
1 SIMPLE c_piloto_flota index PRIMARY PRIMARY 8 NULL 6 Using where; Using index

Debe haber algun problema al cruzar las tablas, ya que no compara bien las KEYS de una tabla con la de otra, y no elimina las que no coinciden, por lo que siempre devuelve algun resultado, aunque dicha relacion no exista.

Si la solución no es curzarlas todas, sino sólo tener una relacion directa 'piloto'<->'privilegio', ¿Cómo puedo hacer para crear perfiles para cada usuario, dependiendo de sus características, rango, puesto de directiva, etc...?

Espero que se me haya entendido, o eso he intentado. Agradecería una ayudita, ya que he buscado por todo, y me he tirado horas y más horas intentando solucionarlo.

Gracias por adelantado.
Martín