Bonjour,
Je me demande qu'est-ce qui serait le plus optimisé pour le cas suivant :
J'ai deux tables :
- Sample : qui contient en gros des individus
- Variant ; qui contient les caractéristiques de ces individus.
un Sample est lié à un très grand nombre de Variant diférents (disons 1 à 5 millions)
et chaque variant est commun à plusieurs sample.
Pour vous donner un ordre de grandeur, j'ai actuellement un jeu de test où j'ai
- 20 samples
- plus de 100 millions d'associations variant - samples
- mais en fait "à peine" 10 millions de variant différents
La question maintenant est de savoir comment faire la jointure entre ces deux données de façon à ce que ça soit le plus rapide ensuite quand on fait des requêtes du genre :
- donne moi tout les variants concernant tel sample;
- donne moi tout les variant commun à ces deux samples, mais pas à celui là;
- etc.
Je vois 3 possibilités :
- faire une table SampleVariant avec 2 champs : sample_id et variant_id.
- mettre un champs de type array(int) dans la table variant, qui contiendrait pour chaque variant la liste des samples qui le contienne
- mettre un champs de type array(bool) dans la table variant qui indiquerait pour chaque variant, grace au booléen à la position idx=sample_id du array, si le sample contient ou pas ce variant.
(Pour l'instant je n'ai eu le temps de tester que la première solution)
Quel est votre avis ? Postgre indique dans sa doc qu'on peut mettre des index sur les champs array, mais je me demande en quelle mesure c'est vraiment efficace et conseillé de le faire. Si à terme j'ai des milliers de sample, et des dizaines de millions de variants...
Partager