PHP/MySql : quel schéma de table pour sys de gestion de docs

PHP/MySql : quel schéma de table pour sys de gestion de docs - PHP - Programmation

Marsh Posté le 11-01-2003 à 17:06:15    

Je fais un système de gestion de docs.
 
Pour chaque doc on a : titre, nom du fichier, description, categories.
Les catégories ont un numéro et elles sont gérées dynamiquement.
 
Mon pb est qu'un doc peut appartenir à pls catégories donc je ne peux faire de jointure.
Comment dois-je organiser cela ?
 
Un champs VARCHAR dans lequel je mettrais les n° de cat du doc séparés de "|" (ex : 1|7|8). Ensuite pour afficher en fonction de la cat on fait un categories LIKE '1'. Mais c'est un peu nul ! Surtout que LIKE '1' retourne aussi les docs des cats 10, 11, etc.

Reply

Marsh Posté le 11-01-2003 à 17:06:15   

Reply

Marsh Posté le 11-01-2003 à 18:06:11    

Il y en a beaucoup des catégories ?
Tu peux utiliser des masques binaires :)

Reply

Marsh Posté le 11-01-2003 à 18:10:02    

moi je ferai une table document avec un clé primaire id_doc, une table catégorie avec une clé primaire id_cat et une table de liaison doc_cat avec 2 colonnes (id_doc, id_cat) et comme clé primaire (id_doc, id_cat).
surtout pas utiliser la méthode avec les like, parce que tu te trouveras avec des requêtes non optimisées et lourdes pour ton serveur (et donc pour ton temps de réponse).
 
A+
Dropsy

Reply

Marsh Posté le 11-01-2003 à 18:51:39    

dropsy >> C noté. Merci bcp !
 
Bebert >> - de 100 catégories et - de 1000 docs donc ça ne fait pas trop. Les masques binaires OK, mais c quoi ?? :D C comme le sys de permissions de fichiers ? Où puis-je me documenter sur ça ? Est-ce mieux que la solution de dropsy ?

Reply

Marsh Posté le 11-01-2003 à 19:02:48    

100 catégories :/  
Ca ira pas [:proy]  
 
C'est tout simplement le fait d'utiliser les bits d'un entier.
1er  bit positionné -> 1ère catégorie
2ème bit positionné -> 2ème catégorie
...
 
Pour faire une recherche, tu peux utiliser un masque.
SELECT * FROM table WHERE categorie & 5
pour ceux qui ont la catégorie qui correspond au bit 2 et 0
 
Si tu n'avais qu'une dizaine ou une vingtaine de catégories, c'est bon. Mais un entier sur 100 bits, ca fait beaucoup :D


Message édité par mrbebert le 11-01-2003 à 19:04:07
Reply

Marsh Posté le 11-01-2003 à 19:27:42    

mrBebert > je connaissais pas cette technique :??:  
j'en vois pas trop l'intéret. Tu l'utilises dans quels cas?

Reply

Marsh Posté le 11-01-2003 à 19:33:58    

C'est pratique pour regouper plusieurs propriétés "simples" (oui/non généralement) dans peu d'espace.
 
Par exemple, pour des droits dans une table de personnes, c'est idéal. Plutot que de définir plusieurs colonnes correspondant chacune à un droit et ne contenant que 2 valeurs (oui ou non), autant tout regrouper dans un seul champ.
Ca occupe peu de place et c'est facile à manipuler :)  
 
Ca aurait été adapté à ton cas si tu avais eu moins de catégories.

Reply

Marsh Posté le 12-01-2003 à 17:00:53    

mrBebert a écrit :

C'est pratique pour regouper plusieurs propriétés "simples" (oui/non généralement) dans peu d'espace.
 
Par exemple, pour des droits dans une table de personnes, c'est idéal. Plutot que de définir plusieurs colonnes correspondant chacune à un droit et ne contenant que 2 valeurs (oui ou non), autant tout regrouper dans un seul champ.
Ca occupe peu de place et c'est facile à manipuler :)  
 
Ca aurait été adapté à ton cas si tu avais eu moins de catégories.


 
C'est bien ce que je me disais : c comme la gestion des droits RWX. Même si ça ne va pas pour mon cas, j'ai appris qq chose au moins :D !

Reply

Marsh Posté le 14-01-2003 à 14:48:18    

Code :
  1. SELECT ... WHERE documents.doc_id=liaison.doc_id AND liaison.cat_id=XX


 
J'ai été obligé de mettre 2 index dans ma table liaison :
PRIMARY KEY (doc_id, cat_id);
INDEX (cat_id);
 
Sinon ma requête parcourait toute la table documents. Comprends pas pkoi vu que les index sont sur la tabel liaison ????
Si qq'un a la clé du mystère.

Reply

Marsh Posté le 14-01-2003 à 15:30:49    

Dost67 a écrit :


J'ai été obligé de mettre 2 index dans ma table liaison :
PRIMARY KEY (doc_id, cat_id);
INDEX (cat_id);


2 clés primaires tu veux dire ? c normal, puisque la clé doit être unique. (j'ai du mal à cerner ton problème)
 
sinon, ceci devrait être plus optimisé

Code :
  1. SELECT document FROM liaison, documents WHERE liaison.cat_id=XX AND documents.doc_id=liaison.doc_id

Reply

Marsh Posté le 14-01-2003 à 15:30:49   

Reply

Marsh Posté le 16-01-2003 à 16:49:07    

Index sur documents :
http://dost67.free.fr/pbphp/php1.png
 
Index sur liaison :
http://dost67.free.fr/pbphp/php2.png
 
Explain de la requête

Code :
  1. EXPLAIN SELECT D.doc_nom FROM documents D, liaison L WHERE D.doc_id=L.doc AND L.cat='12'


http://dost67.free.fr/pbphp/php3.png
 
Si on enlève l'index cat (le 2e, pas le primary) de la table liaison eh bien la table documents est parcourue en entier :
http://dost67.free.fr/pbphp/php4.png
Pourtant ça ne devrait pas car d'un côté du AND j'utilise la première partie de l'index (doc) et de l'autre côté du AND la seconde partie (cat).


Message édité par Dost67 le 16-01-2003 à 16:49:52
Reply

Marsh Posté le 16-01-2003 à 16:59:30    

Ca y'est j'ai résolu le pb avec cette requête :

Code :
  1. SELECT D.doc_nom FROM documents D, liaison L WHERE L.cat='12' AND D.doc_id=L.doc


J'ai bien entendu inverser le PRIMARY KEY en mettant cat,doc au lieu de doc,cat... Now ça fonctionne bien. Avant c'était moins optimisé car ça faisait la jointure entre les deux tables avant de sélectionner la catégorie. Maintenant ça sélectionne la catégorie et ça fait la jointure après comme ça on a moins de données à joidre.

Reply

Marsh Posté le 16-01-2003 à 22:17:02    

c'est ce que j'ai dit ;) (enfin, je l'ai pas expliqué...)
 :hello:

Reply

Marsh Posté le 17-01-2003 à 16:55:10    

ethernal a écrit :

c'est ce que j'ai dit ;) (enfin, je l'ai pas expliqué...)
 :hello:  


Sans me dire d'intervertir la PRIMARY KEY et de suppr le 2e index ! Mais effectivement c'est en lisant ton message que j'ai eu l'idée. Donc MERCI !

Reply

Marsh Posté le 17-01-2003 à 17:21:43    

Dost67 a écrit :


Sans me dire d'intervertir la PRIMARY KEY et de suppr le 2e index ! Mais effectivement c'est en lisant ton message que j'ai eu l'idée. Donc MERCI !


oups j'avais pas vu  :ange:  
je ne savais pas que cela avait bcp d'importance l'ordre des primary key.
donc c'est moi qui te remercie, je ferai plus attention la prochaine fois  :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed