2008-11-28 6 views
2

J'utilise une base de données MSSQL et je souhaite créer une colonne qui n'a que 4 valeurs possibles. Est-il possible de définir une colonne de 2 bits? Je vois le type de données bit, puis le plus petit suivant est tinyint qui est de 1 octet complet.Champ de base de données multi-bits

S'il n'y a pas un tel champ, je serais intéressant de savoir pourquoi.

Merci.

+0

Veuillez modifier la question afin de publier les 4 valeurs possibles; cette question a une "odeur de code" - l'intuition de notre programmeur nous dit que vous pouvez aboyer sur le mauvais arbre –

Répondre

2

Je ne vois pas la raison d'un tel champ.

Il ne peut certainement pas être l'espace - ce n'est pas cher aujourd'hui, et une économie de 6 bits est vraiment négligeable, sauf si vous avez beaucoup de lignes. Mais dans ce cas, il prendra beaucoup de place de toute façon, et 6 bits de plus par rangée ne feront plus guère de différence.

La vitesse n'est pas non plus une raison valable. De tels champs de bits nécessiteraient une manipulation supplémentaire pour stocker et récupérer, rendant le processus entier beaucoup plus lent que de traiter simplement un octet entier. Enfin, s'il s'agit de contraintes, vous devez utiliser des clés étrangères ou des types définis par l'utilisateur (bien que cela nécessite un codage supplémentaire dans .NET). Bien que j'utilise simplement un octet et implémente la contrainte dans mon application. Pas si gentil peut-être, mais beaucoup plus facile.

Mise à jour: Bien que, oui, une contrainte "enum" serait utile dans MSSQL. Mais c'est encore un peu différent d'un simple champ de 2 bits.

3

Quelle est votre préoccupation avec la taille du champ? La façon d'implémenter un domaine de domaine devrait utiliser une contrainte de clé étrangère (MSSQL devrait l'avoir).

+0

Vous pouvez aller de l'avant et dire "MSSQL a ça". Bien sûr, il a des contraintes de clés étrangères. – MusiGenesis

1

Donc vous dites que je devrais juste avoir une clé étrangère à une autre table qui contient mes quatre valeurs?

Je n'ai pas de problème sérieux avec cela. Je ne vois pas l'intérêt de donner un octet complet à quelque chose qui n'a besoin que de 2 bits. Je suis plus curieux quant aux raisons pour lesquelles un champ de longueur binaire variable n'existe pas.

1

Je suis avec friol à ce sujet.

Je créer une table de recherche qui contient vos quatre valeurs possibles, puis les lier via une clé étrangère. En ce qui concerne le type de données, smallint est aussi petit que vous allez l'obtenir, SQL Server n'est pas vraiment conçu pour contenir des bits de données individuels et les manipuler, mais cela peut être fait via des opérateurs Bitwise dans des colonnes binaires, mais même le plus petit d'entre eux est beaucoup plus grand sur disque. La colonne SQL Server Bit est également inhabituelle car elle possède 3 valeurs potentielles (1, 0 et null).

+0

TinyInt est seulement 1 octet, et bit est seulement un bit ... Albiet vous prenez encore tout un buyte de stockage sur disque pour les huit premières colonnes bits définies dans le tableau ... –

1

Sans ressasser ce que les autres messieurs ont dit, si vous voulez toujours faire cela, il n'y a aucun moyen direct ... Mais vous pouvez utiliser deux colonnes de bits,

puis ajouter une colonne calculée qui génère la les valeurs (0-3) qui correspondent aux valeurs des colonnes de 2 bits ....

CREATE TABLE [dbo].[testTable](
    [colA] [bit] NOT NULL, 
    [colB] [bit] NOT NULL, 
    [CalcCol] AS (case [colA] when (1) then (2) else (0) end+[colB]) 
) ON [PRIMARY] 

si vous avez besoin d'un ensemble différent de quatre valeurs alors 0-3 juste les mettre dans la formule de calcul:

CREATE TABLE [dbo].[testTable](
    [colA] [bit] NOT NULL, 
    [colB] [bit] NOT NULL, 
    [CalcCol] As 
     (Case ColA 
      When 0 Then Case ColB WHen 0 Then ValueA Else ValueB End 
        Else Case ColB WHen 0 Then ValueC Else ValueD End 
      End) 
) ON [PRIMARY] 

Le seul problème est que la colonne calculée est pas directement « inscriptible » - vous » d doivent écrire dans les champs de bits individuels dans le code séparé ... comme

Update TestTable Set 
    colA = Case When Value In (ValueA, ValueB) Then 0 Else 1 End, 
    colB = Case When Value In (ValueA, ValueC) Then 0 Else 1 End 
Where ... 
+0

Pas une mauvaise idée là-bas, et basé sur votre commentaire ci-dessus, cela utiliserait 1 octet par ligne si je suis correct (colonnes de 2 bits = 1 octet par ligne min), et l'élément calculé serait fait à la volée correcte? –

+0

oui - c'est exactement correct .. Jusqu'à 8 champs de bit dans une table utilisera seulement un octet ... –

0

à moins que votre base de données est stockée sur une disquette, je ne transpirer. Prenez l'avis du reste ici et continuez avec la construction du reste de la base de données.

Questions connexes