interface SetOwner { ... }
class User implements SetOwner { ... }
class School implements SetOwner { ... }
class Set {
SetOwner owner;
}
Re sus comentarios:
Así la tabla SetOwner contiene ambos identificadores de usuario y SchoolIDs, ¿correcto? Eso significaría que no se me permitiría tener la misma identificación para un usuario y una escuela. ¿Cómo puedo hacer cumplir esto?
Deje que la tabla SetOwners genere valores de id. Debe insertarlo en SetOwners antes de poder insertarlo en Usuarios o Escuelas. Por lo tanto, realice las identificaciones en Usuarios y escuelas no autoincrementando; sólo tiene que utilizar el valor que se genera por SetOwners:
INSERT INTO SetOwners DEFAULT VALUES; -- generates an id
INSERT INTO Schools (id, name, location) VALUES (LAST_INSERT_ID(), 'name', 'location');
De esta manera el valor ID NO dada será utilizado tanto para una escuela y un usuario.
Si me gustaría obtener el tipo de propietario para un conjunto, ¿necesito un atributo ownerType en mi tabla de SetOwner?
Sin duda puede hacer esto. De hecho, puede haber otras columnas que sean comunes tanto para los usuarios como para las escuelas, y usted podría poner estas columnas en el supertable SetOwners. Esto entra en el patrón de Martin Fowler Class Table Inheritance.
Y si quiero obtener el nombre de la escuela o el usuario (cualquiera que sea el tipo), puedo hacer esto con una sola consulta, o necesito dos consultas (primero para obtener el tipo y segundo para obtener el nombre)?
Tienes que hacer una unión. Si realiza una consulta desde un conjunto determinado y sabe que pertenece a un usuario (no a una escuela) puede omitir unirse a SetOwners y unirse directamente a los usuarios. Las uniones no tienen necesariamente que pasar por claves externas.
SELECT u.name FROM Sets s JOIN Users u ON s.SetOwner_id = u.id WHERE ...
Si no sabe si un determinado conjunto pertenece a un usuario o una escuela, tendría que hacer una combinación externa a la vez:
SELECT COALESCE(u.name, sc.name) AS name
FROM Sets s
LEFT OUTER JOIN Users u ON s.SetOwner_id = u.id
LEFT OUTER JOIN Schools sc ON s.SetOwner_id = sc.id
WHERE ...
Usted sabe que el SetOwner_id debe relacione una u otra tabla, Usuarios o Escuelas, pero no ambas.
¿Qué usaste para hacer el gráfico? – basszero
@basszero: MySQL Workbench –
wow! ¡Ha recorrido un largo camino desde la última vez que lo probé! – basszero