2010-06-08 10 views
9

Los estándares de desarrollo de base de datos en nuestra organización establecen que los campos varchar no deben permitir valores nulos. Deben tener un valor predeterminado de una cadena vacía (""). Sé que esto facilita las consultas y la concatenación, pero hoy, uno de mis compañeros de trabajo me preguntó por qué ese estándar solo existía para los tipos varchar y no para otros tipos de datos (int, datetime, etc.). Me gustaría saber si otros consideran que esto es un estándar válido y defendible, o si varchar debe tratarse del mismo modo que los campos de otros tipos de datos.Columnas Varchar: anulables o no

Creo que esta norma es válida por la siguiente razón:

Creo que una cadena vacía y los valores nulos, aunque técnicamente diferentes, son conceptualmente los mismos. Una cadena vacía de longitud cero es una cadena que no existe. No tiene valor. Sin embargo, un valor numérico de 0 no es lo mismo que NULO.

Por ejemplo, si un campo llamado OutstandingBalance tiene un valor de 0, significa que quedan $ 0.00. Sin embargo, si el mismo campo es NULL, eso significa que el valor es desconocido. Por otro lado, un campo llamado CustomerName con un valor de "" es básicamente el mismo que un valor de NULL porque ambos representan la inexistencia del nombre.

Leí en alguna parte que una analogía para una cadena vacía vs. NULL es la de un CD en blanco vs. ningún CD. Sin embargo, creo que esta es una analogía falsa porque todavía existe un CD en blanco físicamente y todavía tiene un espacio de datos físicos que no tiene ningún dato significativo escrito en él. Básicamente, creo que un CD en blanco es el equivalente de una cadena de espacios en blanco (""), no una cadena vacía. Por lo tanto, creo que una cadena de espacios en blanco es un valor real separado de NULL, pero una cadena vacía es la ausencia de valor conceptualmente equivalente a NULL.

Háganme saber si mis creencias con respecto a las cadenas de longitud variable son válidas, o por favor, infórmeme si no lo son. He leído varios blogs/argumentos con respecto a este tema, pero todavía no veo una verdadera diferencia conceptual entre NULL y cadenas vacías.

Respuesta

15

Se reduce a esto: en su aplicación, para una cadena específica, ¿hay alguna diferencia entre tener una cadena vacía o no tener una cadena?

Si no hay ninguna distinción, entonces el estándar que está siguiendo está bien.

Si encuentra que hay una diferencia, entonces el null tiene un significado distinto y debe permitirse.

En mi experiencia, null normalmente se modela para significar unknown.

Aquí es un ejemplo más concreto - los segundos nombres de personas:

  • Si conoce el nombre, entonces el valor se rellena
  • Si usted sabe que la persona no tiene segundo nombre, a continuación, utilizar una cadena vacía ('')
  • Si no saber si una persona tiene un nombre, un null pueden ser más apropiados

una vez más, si su aplicación trata a las personas w Sin un segundo nombre y aquellos en los que esto se desconoce de manera idéntica, usar una cadena vacía para ambos tiene sentido (incluso si significa perder cierta información).

+0

+1: Opción de columna de unidad de reglas empresariales, no tipo de datos. Además, no hay ahorro de espacio usando cadenas NULL vs longitud cero: http://vampirebasic.blogspot.com/2009/01/sql-server-null-varchar-vs-empty.html –

1

No, nulo es un valor muy distintivo.Por ejemplo, solo uno de más de una docena, null puede significar "no tenemos ningún valor", mientras que la cadena vacía significa "tenemos una respuesta y no es nada". Esto sería útil, por ejemplo, como respuesta a una pregunta: nunca obtuvo una respuesta o la respuesta no fue nada ...

Hay un GRAN libro blanco flotando por ahí titulado algo así como "los 18 significados de NULL" - ¡No recuerdo exactamente cuál es el número entero! De todos modos, ese documento ha estado disponible al menos desde principios de la década de 1990 y es realmente fantástico si puedes encontrarlo. No he hecho una búsqueda web.

El problema real con los nulos es que pueden alterar "erróneamente" las filas que se devuelven. Por ejemplo, si usted dice

seleccione strcol1, datecol2, someint3 de fubar donde ...

Si strcol1 pasa a ser nula, no obtendrá un valor de vuelta de esa fila porque hay un implícito ", donde strcol1 no es nulo ", por lo que puede faltar toda una fila.

Esto no es cierto para todos los sistemas RDBMS, pero ha sido cierto para algunos durante bastante tiempo, por lo que si desea que su código pueda moverse de un RDBMS a otro, debe tener MUCHO cuidado al manejar valores nulos.

Otro punto: Oracle - o al menos algunas versiones de Oracle - convertirá silenciosamente cadenas vacías en nulas. Esto es realmente escandaloso, pero de alguna manera, lo han tenido en producción "para siempre". ¡Cuidado! Mi solución es usar alguna otra cadena para significar "la secuencia vacía", más a menudo un carácter de espacio único.

Cuestiones relacionadas