2009-01-14 13 views
63

Estoy uniendo un sitio web de imágenes. El esquema básico es bastante simple MySQL, pero estoy teniendo problemas para tratar de representar posibles indicadores de administración asociados con una imagen ("inapropiado", "con derechos de autor", etc.). Mi idea actual es la siguiente:clave externa de MySQL para permitir NULL?

tblImages (
    imageID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    ... 
); 

tblImageFlags (
    imageFlagID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    imageID INT UNSIGNED NOT NULL, 
    flagTypeID INT UNSIGNED NOT NULL, 
    resolutionTypeID INT UNSIGNED NOT NULL, 
    ... 
); 

luResolutionTypes (
    resolutionTypeID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    resolutionType VARCHAR(63) NOT NULL, 
    ... 
); 

(truncada para facilitar la lectura; una variedad de claves externas e índices están en orden, lo juro)

tblImageFlags.flagTypeID está con clave externa en una tabla de búsqueda de tipos de bandera, y como se puede imaginar tblImageFlags.resolutionTypeIDdebe ser de código foráneo en luResolutionTypes.resolutionTypeID. El problema es que, cuando se emite una bandera por primera vez, no hay un tipo de resolución lógica (yo declararía que esto es un buen uso de NULL); sin embargo, si se establece un valor, debe tener una clave externa en la tabla de búsqueda.

No puedo encontrar una solución de sintaxis MySQL para esta situación. ¿Existe? Los mejores finalistas son:

  • Añadir un "no moderado" tipo de resolución
  • Añadir una entrada NULL-luResolutionTypes.resolutionTypeID (sería esto incluso trabajar en una columna de AUTO_INCREMENT?)

Gracias por la comprensión!

PS Bonus apunta a quien me dice si, en el caso de las bases de datos, son "índices" o "índices".


Seguimiento: (! No establezca una columna a NOT NULL si lo desea para permitir NULL) gracias a Bill Karwin para señalar lo que resultó ser un error de sintaxis en la estructura de la tabla . Y una vez que tengo karma suficiente para darle los puntos de bonificación, yo :)

Respuesta

96

Puede resolver esto permitiendo NULL en la columna de clave externa tblImageFlags.resolutionTypeID.


PS puntos de bonificación a quien me dice si, en el caso de las bases de datos, es "índices" o "índices".

el plural de índice debe ser índices.

Según "Modern American Usage" por Bryan A. Garner:

Para propósitos ordinarios, índices es el plural preferible, no índices. ... Índices, aunque menos pretencioso que foros o dogmata, es pretenciosa, sin embargo. Algunos escritores prefieren los índices en contextos técnicos, como en las matemáticas y las ciencias.Aunque no es el mejor plural para índice, índices es permitido en el sentido "indicadores". ... Evite el singular indice, una formación inversa del plural índices.

+4

¿Qué hace con las claves externas a las columnas de clave principal que no pueden ser NULL? Este es un problema que ha plagado mis aplicaciones a lo largo de los años y, a veces, termino usando 0 o prescindiendo de la relación de clave externa, pero eso no es óptimo. – glyph

+0

@glyph: Eso no tiene sentido. Si la columna FK no hace referencia a ninguna entrada PK específica, entonces haga que el FK sea nulable. Si no se permite que la columna FK sea nula, * debe * hacer referencia a una entrada existente en la columna PK. Usar 0 o algún otro valor falso para indicar "ninguna entrada referenciada" no es válido. –

+0

En este caso (al menos en MySQL) no se permitirá la clave foránea, porque el fk no puede ser nulo si el pk no es nulo, y los pks en mysql no son siempre nulos. Lo que quiero decir es cómo imponer la integridad referencial entre el campo fk y la columna pk si hay un valor presente, pero también permitir valores nulos. Usar un 0 como entrada ficticia es definitivamente un truco que requiere soluciones en otra parte de su aplicación, pero es válido. – glyph

Cuestiones relacionadas