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?
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.
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) .