database - guia - NULL vs Empty cuando se trata de la entrada del usuario
qgis español (7)
Si bien su ejemplo es principalmente para cadenas, me gusta decir que utilizo null para campos numéricos y booleanos. Un saldo de cuenta de 0 es muy diferente a mí como uno que es nulo. Lo mismo para 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ó en absoluto. No usar null en estos casos me requeriría tener una mesa extra 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.
Sí, otra pregunta de cadena NULL vs cadena vacía.
Estoy de acuerdo con la idea de que NULL significa no establecer, mientras que cadena vacía significa "un valor que está vacío". Este es mi problema: si el valor predeterminado para una columna es NULL, ¿cómo permito que el usuario ingrese ese NULL?
Digamos que se crea un nuevo usuario en un sistema. Hay un campo de nombre y apellido; apellido es requerido mientras el primer nombre no es. Al crear al 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.
Cuando miro la base de datos, veo que el primer nombre no está establecido. La pregunta que inmediatamente se me ocurre es que tal vez nunca vieron el campo del primer nombre (es decir, debido a un error). Pero este no es el caso; se fueron si están en blanco.
Entonces, mi pregunta es, ¿cómo decides cuándo un campo debe establecerse en NULL o una cadena vacía al recibir la entrada del usuario? ¿Cómo sabe que el usuario quiere que el campo no se establezca sin detectar el foco o si borran un valor ... o ... o ...?
Pregunta relacionada: ¿Debo usar NULL o una cadena vacía para no representar datos en la columna de la tabla?
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 surgiría de forma regular es para las fechas que no existen, como una base de datos de empleados con un campo "fecha de finalización". En ese caso, todos los empleados actuales deberían 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 verificarlo y desactivarlo para ver el valor correspondiente a nulo (o de una manera más fácil de usar, ninguna). 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 se habilita una vez que el usuario desmarca la casilla de verificación nulo.
Intento mantener las cosas simples. En este caso, haría que la columna de primer nombre no sea nulable y permita espacios en blanco. De lo contrario, tendrá tres casos para tratar en cualquier lugar que consulte este campo:
- Primer nombre en blanco
- Nombre nulo
- Nombre no en blanco
Si elige "en blanco es nulo" o "nulo está en blanco", tendrá dos casos. Dos casos son mejores que tres.
Para responder mejor a su pregunta: es probable que el usuario que ingresa datos no sepa (y no deba) nada sobre lo que es un "nulo" y cómo se compara con un "vacío". Este problema debe resolverse limpia y consistentemente en el sistema, no en la IU.
Lo que debes hacer es descubrir qué comportamiento deseas. 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 desvía como si estuvieras pensando en un estado "unificado", otro de "vacío intencional" 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 será encontrada; parece que el mapeo fácil es
NULL → sin inicializar
"" → a propósito desarmado
un nombre → inicializado.
Nunca he tenido un uso para un valor NULL en el código de producción. Una cadena vacía es un buen valor centinela 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 encontrarle algún uso, pero creo que está muy usado. Sin embargo, si tuviera que usar un valor NULL, imagino que lo usaría en cualquier lugar en el que desee representar un valor vacío.
Rompo el patrón y digo que siempre usaré NULL para cadenas de longitud cero, por las siguientes razones.
Si comienza a cortar las implicaciones de los espacios en blanco, debe asegurarse de que cada desarrollador lo lea y escriba de la misma manera.
¿Cómo se alfabetiza?
¿Se puede determinar inequívocamente cuándo un usuario omitió ingresar un valor, en comparación con dejarlo en blanco intencionalmente?
¿Cómo buscaría inequívocamente la diferencia? ¿Puede un usuario de pantalla de consulta indicar NULL frente a blanco con la sintaxis de formulario de entrada estándar?
En la práctica, nunca se me ha prohibido leer y escribir datos usando un comportamiento predeterminado y no sorprendente usando esta regla. Si necesitaba saber la diferencia, he usado un campo booleano (que es más fácil de asignar a dispositivos UI no ambiguos). En un caso, utilicé un desencadenante para forzar True => valor nulo, pero nunca lo vi invocado porque la capa BR filtraba la condición de manera efectiva.
Si el usuario proporciona una cadena vacía, siempre la considero nula desde la perspectiva de la base de datos. Además, generalmente recortaré mis entradas de cadena para eliminar espacios iniciales / finales y luego verifico si está vacío. Es una pequeña ganancia en la base de datos con tipos varchar () y también reduce los casos de búsqueda, ya que solo necesito verificar que el name is null
lugar de que el name is null or name = ''''
También podrías ir por el otro lado, convirtiendo null a ''''. De cualquier manera, elija una manera y sea consecuente.