Pregunta

Customers
 customer_id

Orders
 order_id
 customer_id fk

Si tengo dos tablas y definir una clave externa en customer_id en la tabla pedidos, por lo que le permite tener un valor nulo que estoy diciendo que puedo tener un orden que no tiene un cliente asociado a él. Como tal, la noción de una clave externa anulable está en agudo contraste con el propósito de una clave externa, que es hacer cumplir esta restricción.

¿Hay un sencillo ejemplo de una situación en la que sería necesaria una clave externa anulable? O un argumento a favor de permitir que ellos?

¿Fue útil?

Solución

Imagínese una tabla que tiene el TODOs de un equipo. Si un TODO aún no se ha asignado a un miembro del equipo, su user_id se NULL. Si no se NULL es una clave externa a la tabla users.

Otros consejos

No, claves externas nunca son anulables necesaria .

Siempre se puede normalizar opcional 1-muchos relación. Tomando su ejemplo, es posible que tenga las siguientes tablas:

Customers: customer_id, ...
Orders: order_id, ...
OrdersCustomers: order_id, customer_id
  UNIQUE(order_id)

Las dos únicas limitaciones asegurarse de que una orden puede pertenecer a un solo cliente, y nunca al mismo cliente dos veces.

Si usted siempre debe normalizar una relación tal, es una historia diferente. En algunos casos desnormalización puede conducir a implementaciones más simples.

  

Como tal, la noción de un anulable   clave externa está en agudo contraste con la   propósito de una clave externa, que consiste en   hacer cumplir esta restricción.

El propósito de una clave externa es la de explicitar el concepto del número entero aleatorio en la tabla Pedidos en realidad se refiere a un elemento de la tabla Clientes. En realidad hacer cumplir esa como una restricción es incidental.

Para establecer un uso anulable o nula clave externa por debajo de secuencia de comandos SQL

ALTER TABLE Return_COMMENTS MODIFY order_ID Number NULL;

existe, hacer algo de estructura de árbol, una tabla que relaciona a sí mismo. Considere lo siguiente:

table_node(node_id, parent_node_id, name)

En la raíz, parent_node_id debería ser nula, ¿verdad?

Un escenario de diseño común para el establecimiento de una columna que es nula si tiene una relación uno a muchos relación padre-hijo, pero los niños no tienen que estar presentes.

Cuando un registro padre (como una cuenta) tiene los niños que se pueden eliminar (como las solicitudes de ayuda) este es un buen uso.

Es posible que tenga una columna para MostRecentRequest que incluye el ID de la solicitud de ayuda más reciente. Cuando la solicitud se retira del sistema de la columna de la MostRecentRequest se establece en NULL que significa no hay ninguno presente.

Otro ejemplo es cuando se quiere NULL para significar que una fila no se ha asignado un padre todavía. Tal vez usted tiene peticiones de ayuda que entran y un valor NULL en el campo técnico de tecnología significa que no se ha asignado a la solicitud. Cuando se elimina ese técnico desea que todo su trabajo sin terminar para volver a la piscina restableciendo el valor NULL.

Hay otra situación que se me ocurre:

Dentro de una mesa, que tiene un campo de ID que identifica ese registro. Ese mismo registro puede (o no) tener un solo padre.

tabla con las siguientes columnas:

  • ID como un entero, incremento automático, no anulable
  • parentid como un entero, anulable.

Con una restricción de clave externa, se puede asegurar que si el campo no es nulo, se refiere a una matriz válida. Por otra parte, si se intenta eliminar el registro padre sin fijar a los niños, entonces el padre no se puede eliminar.

Tenemos un montón de estas cosas como nuestra aplicación es algo que comienza con un poco de información básica para un evento y con el tiempo, ya que el evento se planeó con más detalle, se añade más información. Pero cuando se añade la información que queremos para asegurarse de que cumple con la restricción FK. FKs son para la integridad de datos pero todos los datos no siempre se conoce en el momento se inserta los datos iniciales, por lo que los valores nulos se permiten.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top