Pergunta

Ontem eu queria adicionar um campo booleano para uma tabela do Oracle.No entanto, não há, na verdade, um tipo de dados booleano no Oracle.Alguém aqui sabe a melhor maneira de simular um booleano?Pesquisando o assunto, descobri várias abordagens

  1. Use um número inteiro e só não incomodar a atribuição de qualquer coisa diferente de 0 ou 1 para ele.

  2. Use um campo char com " Y " ou "N", como apenas dois valores.

  3. Use um enum com a restrição de VERIFICAÇÃO.

Fazer experientes desenvolvedores Oracle saber qual é a abordagem preferencial/canonical?

Foi útil?

Solução

Eu encontrei este link útil.

Aqui é o parágrafo, destacando alguns dos prós/contras de cada abordagem.

O mais comumente visto design é para imitar a muitos Boolean-como sinalizadores de que a Oracle do dicionário de dados vistas de utilizar, selecionar a opção 'Y' para true e 'N' para false.No entanto, para interagir corretamente com o host ambientes, tais como JDBC, OCCI, e outros ambientes de programação, é melhor selecione 0 para falso e 1 para verdadeiro para que ele possa trabalhar corretamente com o getBoolean e setBoolean funções.

Basicamente, eles defendem o método número 2, para a causa da eficiência, usando

  • valores de 0/1 (devido a interoperabilidade com JDBC do getBoolean() etc.) com uma restrição de verificação
  • um tipo de CHAR (porque utiliza menos espaço do que o NÚMERO).

Seu exemplo:

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

Outras dicas

Própria Oracle usa Y/N para valores Booleanos.Para a integralidade deve ser destacado que o pl/sql possui um tipo booleano, é apenas tabelas que não.

Se você estiver usando o campo para indicar se o registro precisa ser processados ou não, você pode considerar o uso de Y e NULO como os valores.Isto faz para um muito pequeno (leitura rápida) índice que ocupa muito pouco espaço.

Para usar a menor quantidade de espaço que você deve usar um campo CHAR restrita para 'Y' ou 'N'.A Oracle não suporta BOOLEAN, POUCO, ou TINYINT tipos de dados, para CHAR de um byte é tão pequeno como você pode obter.

A melhor opção é 0 e 1 (como números - outra resposta sugere 0 e 1 como CHAR para o espaço-eficiência, mas que um pouco torcido por mim), usando NÃO NULO e uma restrição de verificação de limite de conteúdo para esses valores.(Se você precisar de coluna a ser nulo, então não é um booleano que você está lidando com mas uma enumeração com três valores (...)

Vantagens do 0/1:

  • Independente do idioma.'Y' e 'N' seria bom se todo mundo usou.Mas eles não.Na França eles usam 'S' e 'N' (eu já vi isso com meus próprios olhos).Eu não tenho programado na Finlândia, para ver se eles usam 'E' e 'K' lá - não há dúvida de que eles sejam mais inteligentes do que isso, mas você não pode ter certeza.
  • Congruente com a prática amplamente utilizadas linguagens de programação (C, C++, Perl, Javascript)
  • Joga-se melhor com a camada de aplicação e.g.O Hibernate
  • Leva a mais sucinta SQL, por exemplo, para saber quantas bananas estão prontos para comer select sum(is_ripe) from bananas em vez de select count(*) from bananas where is_ripe = 'Y' ou até mesmo (yuk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

Vantagens do 'Y'/'N':

  • Ocupa menos espaço do que 0/1
  • É o que a Oracle sugere, então pode ser que algumas pessoas são mais utilizados para

Outro cartaz sugerido 'Y'/null para ganhos de desempenho.Se você já comprovada o que você precisa o desempenho e, em seguida, justo o suficiente, mas de outro modo evitar, pois torna a consulta menor natural (some_column is null em vez de some_column = 0) e, em um left join você vai de confundir falsidade com registros inexistentes.

Quer 1/0 ou Y/N com uma restrição de verificação no mesmo.éter caminho é bom.Eu, pessoalmente, prefiro 1/0 como eu faço um monte de trabalho em perl, e é realmente fácil de fazer perl operações Booleanas em campos de banco de dados.

Se você quer realmente uma discussão mais aprofundada sobre esta questão com um dos Oráculos cabeça honchos, confira que Tom Kyte tem a dizer sobre isto Aqui

O banco de dados eu fiz a maioria dos meus trabalhos sobre usado 'Y' / 'N' como booleanos.Com essa implementação, você pode retirar alguns truques como:

  1. Contagem de linhas que são verdadeiras:
    SELECT SUM(CASO QUANDO BOOLEAN_FLAG = 'S' THEN 1 ELSE 0) DE X

  2. Quando o agrupamento de linhas, de impor a "Se uma linha for verdadeira, então todas são verdadeiras" lógica:
    SELECT MAX(BOOLEAN_FLAG) A PARTIR DE Y
    Por outro lado, o uso MIN para forçar o agrupamento false se uma linha for falsa.

Um exemplo de trabalho para implementar o aceite resposta acrescentando um "Boolean" coluna a uma tabela existente em um banco de dados 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))
);

Isso cria uma nova coluna em my_table_name chamado my_new_boolean_column com os valores padrão de 0.A coluna não vai aceitar NULL valores e restringe os valores aceitos para 0 ou 1.

Em nossos bancos de dados utilizamos um enum que garante que vamos passar é VERDADEIRO ou FALSO.Se você é uma das duas formas é muito fácil para começar a adicionar um novo significado para o número inteiro sem passar através de um projeto adequado, ou acabar com esse char, tendo Y, y, N, n, T, t, F, valores de f e ter que lembrar que a seção de código utiliza a tabela e qual a versão da verdade que está a utilizar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top