Se eu tiver vários tipos de um objeto, quando object.type deve ser uma string e quando deve ser uma chave estrangeira?

StackOverflow https://stackoverflow.com/questions/1005384

Pergunta

Vamos dizer que eu tenho livros que podem ser romance, ficção, ou mistério. Eu tenho 2 opções realistas para armazenar esses dados. Uma é ter uma coluna do tipo na minha mesa de livros que é uma string com o valor "romance", "ficção", ou "mistério". A outra é criar uma tabela book_types e armazenar os tipos lá dentro. Então meus livros teria uma chave estrangeira type_id referência a tabela de book_types.

A minha pergunta é como faço para escolher qual é o melhor? Eu vi o método string usada na autenticação Restful Rails plugin que contém informações sobre o estado de usuários - 'inativa', 'ativa', 'pendente' ...

Existe um impacto no desempenho pelo método de tabela de pesquisa considerando que irá acessar para este informações o tempo todo?

Obrigado!

Foi útil?

Solução

A abordagem de chave estrangeira terá um desempenho melhor. comparação de string irá retardar as coisas. É muito mais rápido para comparar números.

Se você quiser acelerar as consultas ainda mais, adicione um índice na coluna que você está usando para referenciar a chave estrangeira. Ao contrário de chaves primárias, índices não são criados automaticamente para as chaves estrangeiras.

Outras dicas

Se nunca há mais informações para ser armazenado contra algo, corda é normalmente muito bem (embora este é um valor não-transitória por isso não é normal-forma).

Este parece ser um bom candidato para uma mesa, no entanto, para que você pode querer fazer mais com categorias por isso deve ser uma tabela de referência, imo.

Na maioria dos casos, a abordagem com uma chave estrangeira para uma tabela separada é melhor - vantagens:

  • A mesa separada lhe dá uma maneira extensível para validar a entrada. Colocar uma restrição de verificação embutida na definição da tabela em seguida, requer um ALTER TABLE para adicionar um novo tipo

  • Se você precisar alterar o texto tipo por algum motivo (por exemplo, "romance" -> "ficção das mulheres" para um exemplo coxo), você só tem uma atualização de leve para a tabela de pesquisa.

  • Você poderia concebivelmente ter tipos para o qual não há entradas ainda e a mesa separada permite que você use uma associação externa para incluir o tipo de conjuntos de resultados SQL.

  • Do ponto de vista da interface, uma tabela separada permite que você facilmente gerar uma lista drop-down de tipos que não necessitam de embutir na interface do usuário.

Tanto quanto o desempenho vai, com o índice apropriado no FK qualquer motor RDBMS terá um bom desempenho -. Une é o que um RDBMS é projetado para

Gostaria de usar fk. Menos informação duplicada.

EDIT: solução Betther: código do MySQL:

CREATE TABLE books
(
    id int AUTO_INCREMENT          not null,
    book_type enum('romance', 'fiction', 'mystery')     not null,
    ....
);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top