Claves foráneas y NULL en mySQL

¿Puedo tener una columna en mi tabla de valores (valor) a la que se hace reference como una key externa a la tabla de valores conocidos, y dejar que sea NULL cuando sea necesario, como en el ejemplo:

Tabla: valores

product type value freevalue 0 1 NULL 100 1 2 NULL 25 3 3 1 NULL 

Tabla: types

  id name prefix 0 length cm 1 weight kg 2 fruit NULL 

Tabla: valores conocidos

 id Type name 0 2 banana 

Nota: Los types en los values tabla y values knownValues son, por supuesto, referencedos en la tabla de types .

Los NULL en foreign keys son perfectamente aceptables. Tratar con NULL en foreign keys es complicado, pero eso no significa que cambie esas columnas a NOT NULL e inserte loggings ficticios ("N / A", "Desconocido", "Sin valor", etc.) en sus tablas de reference.

El uso de NULL en keys externas a menudo requiere el uso de LEFT / RIGHT JOIN en lugar de INNER JOIN.

Aunque puede hacer que las columnas de key externa sean nulables, sugeriría que generalmente es mejor diseñar tablas sin keys externas con nulos. Los nulos invariablemente conducen a ciertas ambigüedades y resultados incorrectos, pero eso es doblemente un problema si se espera que las columnas en cuestión estén sujetas a alguna restricción.

Esta es una relación de 1 a cero a muchos. Lo he usado muchas veces con SQL Server. También creo que es posible hacer esto con MySQL.

Prefiero evitar NULL en mis bases de datos debido a problemas relacionados con la agregación de datos, por lo que, dependiendo de mi layout, coloco una fila UNKNOWN en la tabla de búsqueda.

Sí, es muy posible tener un NULL en su columna restringida por key foránea. Lo intenté. Tenga en count que si no está utilizando el motor de almacenamiento InnoDB, sus restricciones de key externa serán ignoradas de todos modos.

Por supuesto, hay posibilidades de que tengas valores NULL en la key externa, pero para eso no te preocupes por esto, espero que puedas utilizar InnoDB como motor de database para administrar las restricciones key. Para este caso, sugiero usar Left Join o Right Join para get filas de DB y Group By se puede usar para evitar la duplicación. Por favor, no use Inner Join.