2010-04-22 7 views
1

Quelle est la meilleure méthode pour stocker un grand nombre de booléens dans une table de base de données?Table de base de données de valeurs booléennes

Dois-je créer une colonne pour chaque valeur booléenne ou existe-t-il une méthode plus optimale?

employés Tableau

IsHardWorking
IsEfficient
IsCrazy
IsOverworked
IsUnderpaid
... etc.

Répondre

1

Je ne vois pas de problème avec une colonne pour chaque booléen. Mais si vous prévoyez une expansion future et que vous souhaitez utiliser la table uniquement pour les booléens, utilisez une table à deux colonnes avec des colonnes VARIABLE et VALUE, avec une ligne pour chaque booléen.

0

Quelque chose à considérer: à quelle fréquence allez-vous ajouter/modifier/supprimer ces booléens? Si elles ne sont pas susceptibles de changer, vous aimerez probablement les avoir comme colonnes individuelles. Beaucoup de bases de données les emballeront probablement pour vous, particulièrement si elles sont adjacentes dans la rangée, ainsi elles seront stockées efficacement.

Si, d'autre part, vous vous voyez vouloir ajouter/modifier/supprimer ces booléens chaque fois dans un certain temps, vous pourriez être mieux servis par quelque chose comme (excuse PostgreSQL-ismes et les noms de mauvaise qualité):

CREATE TABLE employee_qualities (
    id SERIAL8 PRIMARY KEY, 
    label TEXT UNIQUE 
); 

CREATE TABLE employee_employee_qualities (
    employee_id INT8 REFERENCES employee (id), 
    quality_id INT8 REFERENCES employee_qualities (id), 
    UNIQUE (employee_id, quality_id) 
); 
0

Une colonne pour chacun est la meilleure représentation des besoins de votre entreprise. Vous pourriez combiner un tas de booléens dans une colonne int simple et utiliser des masques binaires pour lire les valeurs, mais cela semble inutilement complexe, et c'est quelque chose que je considérerais seulement s'il y avait un besoin de performance haut de gamme. De plus, si vous utilisez sql server, des champs de 8 bits maximum sont combinés en interne dans un seul int, de sorte que les performances sont déjà faites pour vous. (Je ne sais pas si d'autres dbs le font.)

1

Si la majorité des employés ont les mêmes valeurs pour un large échantillon, il peut être plus efficace de définir une hiérarchie, ce qui vous permet d'établir des valeurs par défaut représentant la norme, et les remplacer par employé si nécessaire.

Votre table d'employés ne stocke plus ces attributs. Au lieu de cela, je voudrais créer une table de définition des attributs:

| ATTRIBUTE_ID | DESCRIPTION  | DEFAULT | 
| 1   | Is Hard Working | 1  | 
| 2   | Is Overpaid  | 0  | 

Ensuite, une deuxième table joignant les attributs aux employés:

| EMPLOYEE_ID | ATTRIBUTE_ID | OVERRIDE | 
| 2   | 2   | 1  | 

Étant donné deux employés, employé ID 1 ne possède pas d'entrée prioritaire, et hérite ainsi des valeurs d'attribut par défaut (travaille dur, n'est pas payé en trop), cependant l'employé 2 a un remplacement pour l'attribut 2 - est payé en trop, et est donc à la fois travailleur et payé en trop. Pour l'intégrité, vous pouvez placer une contrainte unique sur les colonnes EMPLOYEE_ID et ATTRIBUTE_ID dans la table de remplacement, en appliquant que vous ne pouvez remplacer qu'une seule fois un attribut par employé.

Questions connexes