Pregunta

Sí, otra pregunta NULL vs cadena vacía.

Estoy de acuerdo con la idea de que NULL significa no establecido, mientras que una cadena vacía significa "un valor que está vacío". Aquí está mi problema: si el valor predeterminado para una columna es NULL, ¿cómo puedo permitir que el usuario ingrese ese NULL?

Digamos que se crea un nuevo usuario en un sistema. Hay un campo de nombre y apellido; se requiere el apellido mientras que el primer nombre no. Al crear el usuario, la persona verá 2 entradas de texto, una para el primero y otra para el último. La persona elige ingresar solo el apellido. El primer nombre técnicamente no está establecido. Durante la inserción, verifico la longitud de cada campo, estableciendo todos los campos que están vacíos en NULL.

Al mirar la base de datos, veo que el nombre no está configurado. La pregunta que viene a la mente de inmediato es que tal vez nunca vieron el campo de nombre (es decir, debido a un error). Pero este no es el caso; dejaron si está en blanco.

Entonces, mi pregunta es, ¿cómo decide cuándo un campo debe establecerse en NULL o una cadena vacía cuando recibe la entrada del usuario? ¿Cómo sabe que el usuario desea que el campo no se configure sin detectar el foco o si eliminó un valor ... o ... o ...?

Pregunta relacionada: ¿Debo usar NULL? o una cadena vacía para representar ningún dato en la columna de la tabla?

¿Fue útil?

Solución

Casi nunca uso NULL cuando me refiero a datos reales. Cuando se usa para claves externas, diría que NULL es válido, pero casi nunca es válido para los datos ingresados ??por el usuario. La única excepción que probablemente surja con bastante frecuencia es para fechas que no existen, como una base de datos de empleados con una "fecha de terminación". campo. En ese caso, todos los empleados actuales deben tener un valor de NULL en ese campo. En cuanto a hacer que realmente ingresen un valor nulo, para los valores que realmente requieren un valor nulo, pondría una casilla de verificación junto al campo de entrada para que el usuario pueda activarlo y desactivarlo para ver el valor correspondiente a nulo (o de una manera más amigable para el usuario, ninguno). Al habilitar la casilla de verificación para establecer el campo en nulo, el cuadro de texto correspondiente debe estar deshabilitado, y si un valor nulo ya está asociado, debe comenzar como deshabilitado y solo habilitarse una vez que el usuario desmarque la casilla nula.

Otros consejos

Romperé el patrón y diré que siempre usaría NULL para cadenas de longitud cero, por las siguientes razones.

  1. Si comienza a dividir las implicaciones de los espacios en blanco, debe asegurarse de alguna manera de que todos los demás desarrolladores lo lean y escriban de la misma manera.

  2. ¿Cómo se alfabetiza?

  3. ¿Puede determinar inequívocamente cuándo un usuario omitió ingresar un valor, en comparación con dejarlo en blanco intencionalmente?

  4. ¿Cómo preguntaría inequívocamente la diferencia? ¿Puede un usuario de la pantalla de consulta indicar NULL vs. en blanco usando la sintaxis de formulario de entrada estándar?

  5. En la práctica, nunca se me ha prohibido leer y escribir datos con un comportamiento predeterminado y poco sorprendente con esta regla. Si necesito saber la diferencia, he usado un campo booleano (que es más fácil de asignar a dispositivos de interfaz de usuario inequívocos). En un caso, usé un disparador para aplicar True = > valor nulo, pero nunca lo vi invocado porque la capa BR filtró la condición de manera efectiva.

Si el usuario proporciona una cadena vacía, siempre la trato como nula desde la perspectiva de la base de datos. Además, generalmente recortaré mis entradas de cadena para eliminar los espacios iniciales / finales y luego comprobaré si está vacío. Es una pequeña ganancia en la base de datos con los tipos varchar () y también reduce los casos de búsqueda, ya que solo necesito verificar si name es nulo en lugar de name es nulo o name = '' También podría ir hacia otro lado, convirtiendo nulo en ''. De cualquier manera, elija una y sea coherente.

Lo que debe hacer es determinar qué comportamiento desea. No hay un álgebra fija de cómo se interpretan las cadenas de nombres.

Piensa en la máquina de estados aquí: tienes campos que tienen varios estados: se inclina como si estuvieras pensando en un estado de '' unitializado '', otro de '' intencionalmente vacío '' y un tercero con algún valor establecido. CUALQUIER COSA que haga que haga esa asignación y sea consistente con el resto de su programa se encontrará; parece que el mapeo fácil es

NULL ? sin inicializar
" " ? desarmado a propósito
un nombre ? inicializado.

Intento mantener las cosas simples. En este caso, haría que la columna de nombre no sea anulable y permitiría espacios en blanco. De lo contrario, tendrá tres casos para tratar en cualquier lugar que haga referencia a este campo:

  1. Nombre en blanco
  2. Nombre nulo
  3. Nombre no en blanco

Si va con 'en blanco es nulo' o 'nulo está en blanco', entonces tiene dos casos. Dos casos son mejores que tres.

Para responder aún más a su pregunta: el usuario que ingresa datos probablemente no sabe (y no debería) saber nada acerca de lo que es un "nulo" es y cómo se compara con un " vacío " ;. Este problema debe resolverse de forma limpia y coherente en el sistema, no en la interfaz de usuario.

Si bien su ejemplo es principalmente para cadenas, me gusta decir que uso nulo para campos numéricos y booleanos. Un balance de cuenta de 0 es muy diferente para mí como uno que es nulo. Lo mismo para los booleanos, si las personas toman una prueba de opción múltiple con respuestas verdaderas y falsas, es muy importante saber si alguien respondió verdadero o falso o no respondió. No usar null en estos casos requeriría que tenga una tabla adicional o una configuración diferente para ver si alguien respondió una pregunta. Podría usar, por ejemplo, -1 para no completar 0 para falso y 1 para verdadero, pero luego está usando un campo numérico para algo que es esencialmente un booleano.

Nunca, nunca tuve un uso para un valor NULL en el código de producción. Una cadena vacía es un valor centinela fino para un campo de nombre en blanco, número de teléfono o ingreso anual para cualquier aplicación. Dicho esto, estoy seguro de que podrías encontrar algún uso para él, pero creo que está sobreutilizado. Sin embargo, si fuera a usar un valor NULL, imagino que lo usaría en cualquier lugar donde quiera representar un valor vacío.

Siempre he usado NULL para valores no inicializados, empty para valores vacíos intencionalmente y 0 para indicadores desactivados.

Al hacer esto todo el tiempo, está ahí incluso si no lo estoy usando, pero no tengo que hacer nada diferente si necesito esa distinción.

Normalmente estoy probando empty () , pero a veces compruebo isset () que evalúa false en NULL . Esto es útil para que los recordatorios respondan ciertas preguntas. Si está vacío , false o 0 , la pregunta se contesta.

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