AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 6987
Accepted
Thomas Stringer
Thomas Stringer
Asked: 2011-10-20 18:47:56 +0800 CST2011-10-20 18:47:56 +0800 CST 2011-10-20 18:47:56 +0800 CST

INT ou CHAR para um campo de tipo

  • 772

Qual é o melhor design para uma tabela, um Typecampo que é de intou char(1)? Em outras palavras, dado este esquema:

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehType .... not null
)

É mais eficiente (em termos de desempenho) VehTypeser um intou um char(1)? Digamos que você tenha cinco tipos de carros, você deve usar os valores de incremento 0 -> 4 ou caracteres para os tipos (digamos; 'v', 's', 'c', 't', 'm')?

Se for mais do que isso, eu usaria uma tabela Type separada e teria um relacionamento de chave estrangeira, mas não vejo necessidade disso.

Percebo que a sys.objectsexibição do catálogo usa um caractere para o typecampo. Existe uma razão para isso? Estou apenas agarrando o ar aqui, e é o que quer que eu esteja mais confortável?

sql-server database-design
  • 2 2 respostas
  • 6366 Views

2 respostas

  • Voted
  1. Best Answer
    gbn
    2011-10-20T20:23:43+08:002011-10-20T20:23:43+08:00

    Você normalmente usaria tinyint, que também tem 1 byte

    • char(1) será um pouco mais lento porque a comparação usa collation

    • confusão: o que é S: SUV ou Saloon ou Sedan ou Sports?

    • usar uma letra limita você à medida que adiciona mais tipos. Veja o último ponto.

    • todo sistema que vi tem mais de um cliente, por exemplo, relatórios. A lógica de mudar V, S para "Van", "SUV" etc precisará ser repetida. Usar uma tabela de pesquisa significa que é um simples JOIN

    • extensibilidade: adicione mais um tipo ("F" para " Carro voador "), você pode uma linha para uma tabela de pesquisa ou alterar muitos códigos e restrições. E seu código cliente também porque tem que saber o que são V,S,F etc

    • manutenção: a lógica está em 3 locais: restrição do banco de dados, código do banco de dados e código do cliente. Com uma pesquisa e chave estrangeira, pode estar em um só lugar

    O lado positivo de usar uma única letra... er, não vejo nenhuma

    Nota: há uma pergunta relacionada ao MySQL sobre Enums . A recomendação é usar uma tabela de consulta lá também.

    • 19
  2. Fabricio Araujo
    2011-11-01T09:15:52+08:002011-11-01T09:15:52+08:00

    Apenas como um complemento à resposta de great gbn .

    Talvez você possa criar algo assim:

    create table dbo.VehicleType
    (
        VehicleTypeId int not null primary key,
        Name varchar(50) not null,
        Code char(3) null
    ) 
    go 
    
    create table Car
    (
        Name varchar(100) not null,
        Description varchar(100) not null,
        VehTypeId int not null ,
        foreign key FKTypeOfCar(VehTypeId) referenctes dbo.VehicleType (VehicleTypeId) 
    )
    go 
    

    Portanto, você pode fazer o que quiser com seu enum enquanto mantém a integridade relacional (usando uma chave estrangeira). Com a codecoluna, você pode usar seus códigos de caracteres à vontade, para que fique documentado no banco de dados (e você pode extrair as informações do código diretamente do banco de dados, sem uma transformação complicada no código do aplicativo para uma integração de sistemas).

    • 3

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve