Pregunta

Ayer quise agregar un campo booleano a una tabla de Oracle.Sin embargo, en realidad no existe un tipo de datos booleano en Oracle.¿Alguien aquí sabe cuál es la mejor manera de simular un booleano?Al buscar en Google sobre el tema se descubrieron varios enfoques.

  1. Utilice un número entero y no se moleste en asignarle nada más que 0 o 1.

  2. Utilice un campo char con 'Y' o 'N' como los dos únicos valores.

  3. Utilice una enumeración con la restricción CHECK.

¿Saben los desarrolladores experimentados de Oracle qué enfoque es el preferido/canónico?

¿Fue útil?

Solución

encontré este enlace útil.

Aquí está el párrafo que destaca algunos de los pros y los contras de cada enfoque.

El diseño más común es imitar las muchas banderas booleanas que usan las vistas del diccionario de datos de Oracle, seleccionando 'y' para verdadero y 'n' para falso.Sin embargo, para interactuar correctamente con entornos de host, como JDBC, OCCi y otros entornos de programación, es mejor seleccionar 0 para falso y 1 para verdadero para que pueda funcionar correctamente con las funciones GetBoolean y SetBoolean.

Básicamente abogan por el método número 2, en aras de la eficiencia, utilizando

  • valores de 0/1 (debido a la interoperabilidad con JDBC getBoolean() etc.) con una restricción de verificación
  • a tipo de CHAR (porque utiliza menos espacio que NUMBER).

Su ejemplo:

create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`

Otros consejos

El propio Oracle utiliza Y/N para valores booleanos.Para completar, cabe señalar que pl/sql tiene un tipo booleano, sólo las tablas no lo tienen.

Si está utilizando el campo para indicar si el registro debe procesarse o no, podría considerar usar Y y NULL como valores.Esto lo convierte en un índice muy pequeño (de lectura rápida) que ocupa muy poco espacio.

Para utilizar la menor cantidad de espacio, debe utilizar un campo CHAR restringido a 'Y' o 'N'.Oracle no admite tipos de datos BOOLEAN, BIT o TINYINT, por lo que un byte de CHAR es lo más pequeño posible.

La mejor opción es 0 y 1 (como números; otra respuesta sugiere 0 y 1 como CARBONIZARSE para ahorrar espacio, pero eso es demasiado retorcido para mí), usando NOT NULL y una restricción de verificación para limitar el contenido a esos valores.(Si necesita que la columna sea anulable, entonces no se trata de un valor booleano, sino de una enumeración con tres valores...)

Ventajas de 0/1:

  • Idioma independiente.'Y' y 'N' estarían bien si todos lo usaran.Pero no es así.En Francia usan 'O' y 'N' (lo he visto 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 puedes estar seguro.
  • Congruente con la práctica en lenguajes de programación ampliamente utilizados (C, C++, Perl, Javascript)
  • Juega mejor con la capa de aplicación, p.Hibernar
  • Conduce a SQL más conciso, por ejemplo, para saber 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 'Y'/'N':

  • Ocupa menos espacio que 0/1
  • Es lo que sugiere Oracle, por lo que podría ser a lo que algunas personas están más acostumbradas.

Otro cartel sugirió 'Y'/nulo para mejorar el rendimiento.si tienes probado que necesita el rendimiento, entonces es justo, pero de lo contrario evítelo ya que hace que la consulta sea menos natural (some_column is null en lugar de some_column = 0) y en una unión izquierda combinarás la falsedad con registros inexistentes.

Ya sea 1/0 o Y/N con una restricción de verificación.De otra manera está bien.Personalmente prefiero 1/0 porque trabajo mucho en Perl y hace que sea muy fácil realizar operaciones booleanas en Perl en campos de bases de datos.

Si desea una discusión realmente profunda sobre esta pregunta con uno de los jefes de Oracle, consulte lo que Tom Kyte tiene que decir al respecto. Aquí

La base de datos en la que hice la mayor parte de mi trabajo usaba 'Y' / 'N' como valores booleanos.Con esa implementación, puedes realizar algunos trucos como:

  1. Cuente las filas que son verdaderas:
    SELECCIONE SUMA (CASO CUANDO BOOLEAN_FLAG = 'Y' LUEGO 1 MÁS 0) DE X

  2. Al agrupar filas, aplique la lógica "Si una fila es verdadera, entonces todas son verdaderas":
    SELECCIONE MAX(BOOLEAN_FLAG) DE Y
    Por el contrario, utilice MIN para forzar la agrupación a ser falsa si una fila es falsa.

Un ejemplo práctico para implementar la respuesta aceptada agregando una columna "booleana" a una tabla existente en una base de datos Oracle (usando number tipo):

ALTER TABLE my_table_name ADD (
my_new_boolean_column number(1) DEFAULT 0 NOT NULL
CONSTRAINT my_new_boolean_column CHECK (my_new_boolean_column in (1,0))
);

Esto crea una nueva columna en my_table_name llamado my_new_boolean_column con valores predeterminados de 0.La columna no aceptará NULL valores y restringe los valores aceptados a cualquiera de los dos 0 o 1.

En nuestras bases de datos utilizamos una enumeración que garantiza que pasemos VERDADERO o FALSO.Si lo hace de cualquiera de las dos primeras formas, es demasiado fácil comenzar a agregar un nuevo significado al número entero sin pasar por un diseño adecuado o terminar con ese campo char que tiene Y, y, N, n, T, t, Valores F, f y tener que recordar qué sección de código usa qué tabla y qué versión de true está usando.

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