La mejor opción es 0 y 1 (como números - otra respuesta sugiere 0 y 1 como CHAR para la eficiencia del espacio pero eso es demasiado retorcido), usando NOT NULL y una restricción de verificación para limitar el contenido a esos valores. (Si necesita la columna de ser anulable, entonces no es un valor lógico que está tratando con una enumeración, pero con tres valores ...)
Ventajas de 0/1:
- lenguaje independiente. 'Y' y 'N' estarían bien si todos lo usaran. Pero ellos no. En Francia usan 'O' y 'N' (he visto esto con mis propios ojos). No he programado en Finlandia para ver si usan 'E' y 'K' allí; sin duda son más inteligentes que eso, pero no se puede estar seguro.
- Congruente con la práctica en lenguajes de programación ampliamente utilizados (C, C++, Perl, Javascript)
- Se juega mejor con la capa de aplicación, p. Hibernate
- conduce a más sucinta SQL, por ejemplo, para averiguar cuántos plátanos están listos para comer
select sum(is_ripe) from bananas
en lugar de select count(*) from bananas where is_ripe = 'Y'
o incluso (puaj) select sum(case is_ripe when 'Y' then 1 else 0) from bananas
Ventajas de la 'Y'/'N':
- ocupa menos espacio que los 0/1
- es lo que sugiere Oracle, por lo que podría ser lo que algunas personas están más acostumbrados a
Otro póster sugirió 'Y'/null para aumentar el rendimiento.Si ha probado que necesita el rendimiento, entonces es suficiente, pero evite lo contrario, ya que hace que las consultas sean menos naturales (some_column is null
en lugar de some_column = 0
) y en una combinación a la izquierda confundirá la falsedad con registros inexistentes.
Ojalá Oracle tuviese un tipo de datos de "pared" para poder aplastar mi cabeza cuando use booleanos. – Greg