Prérequis:
Les requêtes sql , les relations entre les tables dans une base de donnée , un minimum de connaissance sur l’écriture d’un nombre en base 2
Salut à tous, hello ou bonjour, dans l’article de ce jour, le premier de mon site je me propose de vous parler d’une autre manière de gérer les relations many to many ou les ralations de cardinale (n,n) dans les bases de données. Pour cela prenons l’exemple d’un logiciel qui veut gérer l’appartenance de personne à divers association. Dans notre exemple une association pourra avoir plusieurs personnes et une personne pourra être inscrit dans plusieurs association on est donc face à une relation many to many et le mcd et le mld des tables seront alors :
On remarque que pour la gestion classique de la relation many to many, une table de liaison est crée, contenant l’id de l’association et l’id du participant. Cette manière de faire peut parfois être couteuse, et être facteur de mélange de métier des tables. L’autre méthode peut parfois être facteur d’économie de travail pour votre base de donnée.
BIT OF MASK
Supposons qu’on gère 4 association, l’association A , l’association B, l’association C et l’association D nous voulons pouvoir gérer le fait qu’une personne soit ou non dans l’association A, B, C ou D
Nous pourrions alors gérer cela par un tableau, avec des valeurs booléennes représentées par les nombres 1 et 0, 1 une personne appartient à l’association et 0 le bénévole n’appartient pas à l’association.
Ce qui donnerait alors pour une personne particulière
Association A | Association B | Association C | Association D |
1 | 0 | 0 | 1 |
Dans cette exemple la personne appartient à l’association A et D mais n’appartient pas à B et C
La suite de nombre (1,0,0,1) peut être vu comme la représentation unique d’un nombre en base 2
En traduisant cette suite en base 10, cela donnerait :
1*2^3+0*2^2+ 0 * 2^1+1* 2^0
= 8 + 1 = 9
Le fait qu’une personne appartienne à l’association A et D mais n’appartient pas à B et C peut donc être traduit par le nombre 9
de plus en base 10 appartenir à l’association A peut-être représenter par le nombre 2^3 = 8
en base 10 appartenir à l’association B peut être représenter par le nombre 2^2 = 4
en base 10 appartenir à l’association C peut être représenter par le nombre 2^1 = 2
en base 10 appartenir à l’association D peut être représenter par le nombre 2^0 = 1
Le langage PHP, ainsi que sql nous offre l’opportunité de travailler avec des opérateurs sur les bits, ainsi si nous continuons dans notre exemple :
- le bénévole appartient-il à l’association A ? 9&8 = 8 renvoie true
- le bénévole appartient-il à l’association B ? 9&4 = 4 renvoie false
- le bénévole appartient-il à l’association C ? 9&2 = 2 renvoie false
- le bénévole appartient-il à l’association B ? 9&1 = 1 renvoie true
Un tableau d’appartenance de bénévole aux association A, B, C, D donnerait alors :
Nom | Appartenance |
Dupond | 9 |
Didier | 6 |
Roland | 14 |
Robert | 1 |
- Ainsi Dupond appartient à l’association A et D
- Didier appartient à l’association B et C
- Roland appartient à l’association A, B, et C
- Et Robert appartient à l’association D
Le principe du bit of mask étant établie, reste à l’intégrer à notre petit projet. Le mld et le mcd du projet deviennent alors :
Aprés avoir intégré des données on à alors sur phpmyadmin au niveau de la table associations:
au niveau de la table participants on à :
si l’on voudra recherché toute les association de Durand avec un id = 2 on fera la requête suivante : « SELECT * FROM `participants` INNER JOIN associations ON participants.filtrage_association_participant & associations.cle_de_filtrage_association = associations.cle_de_filtrage_association WHERE participants.id = 2 "
ce qui donnera le résultat suivant:
si l’on recherche toutes les personnes appartenant à l’association secours catholique avec pour id= 3 on fera la requête suivante: SELECT * FROM `participants` INNER JOIN associations ON participants.filtrage_association_participant & associations.cle_de_filtrage_association = associations.cle_de_filtrage_association WHERE associations.id = 3
ce qui donnera pour résultat :
Voila qui clos cette article, j’espère avoir été le plus complet possible 😉