2012-02-10 2 views
5

Je les tableaux suivants:opérations au niveau du bit dans Postgres

types | id | name 
------+----+---------- 
     1 | A 
     2 | B 
     4 | C 
     8 | D 
     16| E 
     32| F 

et

vendors | id | name  | type 
--------+----+----------+----- 
      1 | Alex  | 2  //type B only 
      2 | Bob  | 5  //A,C 
      3 | Cheryl | 32 //F 
      4 | David | 43 //F,D,A,B 
      5 | Ed  | 15 //A,B,C,D 
      6 | Felix | 8  //D 
      7 | Gopal | 4  //C 
      8 | Herry | 9  //A,D 
      9 | Iris  | 7  //A,B,C 
      10| Jack  | 23 //A,B,C,E 

Je voudrais interroger maintenant:

select id, name from vendors where type & 16 >0 //should return Jack as he is type E 
select id, name from vendors where type & 7 >0 //should return Ed, Iris, Jack 
select id, name from vendors where type & 8 >0 //should return David, Ed, Felix, Herry 

Quel est le meilleur indice possible pour les tables types et vendors dans postgres? Je peux avoir des millions de lignes dans les fournisseurs. En outre, quels sont les compromis de l'utilisation de cette méthode bit à bit par rapport à la relation Many To Many en utilisant une 3ème table? Ce qui est mieux?

+0

Je pense que vous voulez dire 'type & 7 = 0', si vous utilisez 'type & 7> 0', vous retournerez tout élément qui correspond à 'A', 'B' ou 'C' résultat dans une réponse supérieure à 0. (Alex, Bob, David, Ed, But, Henry, Iris, Jack) Faire 'type & 7 = 0' donne seulement les items qui correspondent aux trois bits. (Ed, Iris, Jack) –

Répondre

8

utilisation peut utiliser des indices partiels pour travailler autour du fait que « & » est pas un opérateur indexable (afaik):

CREATE INDEX vendors_typeA ON vendors(id) WHERE (type & 2) > 0; 
CREATE INDEX vendors_typeB ON vendors(id) WHERE (type & 4) > 0; 

Bien sûr, vous aurez besoin d'ajouter un nouvel index chaque fois que vous ajouter un nouveau type. C'est l'une des raisons de l'expansion des données dans une table d'association qui peut ensuite être indexée correctement. Vous pouvez toujours écrire des triggers pour maintenir un tableau de bitmaps en plus, mais utilisez la table many-to-many pour maintenir les données normalement, car cela sera beaucoup plus clair. Si votre évaluation complète de la mise à l'échelle et de la performance est de dire «Je peux avoir des millions de lignes», vous n'avez pas fait assez pour commencer ce type d'optimisation. Créez d'abord un modèle clair correctement structuré, optimisez-le ensuite sur la base de statistiques réelles sur son fonctionnement.

Questions connexes