web-dev-qa-db-fra.com

Int ou caractère pour un champ de type

Quel est le meilleur design pour une table, un champ Type qui est de int ou char(1)? En d'autres termes, compte tenu de ce schéma:

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

Est-ce plus efficace (performance sage) pour VehType d'être un int ou a char(1)? Dites que vous avez cinq types de voitures, devriez-vous utiliser les valeurs incrémentées 0 -> 4 ou des caractères pour les types (dire; 'V', 'S', 'C', 'T', 'M')?

Si c'est plus que cela, j'utiliserais une table de type séparée et j'avais une relation de clé étrangère, mais je ne vois pas le besoin de cela.

Je remarque que la vue de catalogue sys.objects utilise un caractère pour le champ type. Y at-il une raison à cela? Est-ce que je viens de saisir l'air mince ici, et c'est ce que je suis plus à l'aise?

19
Thomas Stringer

Vous utiliseriez généralement Tinyint qui est également 1 octet aussi

  • char (1) sera légèrement plus lent car la comparaison des utilisations

  • confusion: Qu'est-ce qui est: SUV ou salon ou berline ou sports?

  • l'utilisation d'une lettre vous limite que vous ajoutez plus de types. Voir le dernier point.

  • chaque système que j'ai vu a plus d'un client, par exemple une déclaration. La logique de la modification de V, S en "Van", "SUV", etc. aura besoin répété. L'utilisation d'une table de recherche signifie qu'il s'agit d'une jointure simple

  • extension: ajoutez un type de plus ("F" pour " voiture volante ") Vous pouvez suivre une ligne à une table de recherche ou modifier beaucoup de code et de contraintes. Et votre code client aussi parce que cela doit savoir ce que v, s, f, etc. sont

  • maintenance: la logique est en 3 places: contrainte de base de données, code de base de données et code client. Avec une recherche et une clé étrangère, il peut être au même endroit

Sur le côté de plus d'utiliser une seule lettre ... ER, n'en vois aucun

Remarque: il existe une question connexe MySQL Question sur Enums . La recommandation consiste également à utiliser une table de recherche là-bas.

20
gbn

Tout comme un complément à super Réponse de GBN .

Peut-être que vous pourriez créer quelque chose comme ça:

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 

Donc, vous pouvez faire comme vous s'il vous plaît avec votre énumé tout en mangeant une intégrité relationnelle (en utilisant une clé étrangère). Avec la colonne code Vous pouvez utiliser vos codes de caractères de caractères à volonté. Il sera donc documenté sur la base de données (et vous pouvez extraire les informations de code directement à partir de DB, sans transformation compliquée sur le code d'application pour une intégration de systèmes) .

3
Fabricio Araujo