Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1449 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°284190
Dost67
Posté le 11-01-2003 à 17:06:15  profilanswer
 

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.

mood
Publicité
Posté le 11-01-2003 à 17:06:15  profilanswer
 

n°284224
mrbebert
Posté le 11-01-2003 à 18:06:11  profilanswer
 

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

n°284226
dropsy
et bonne chance surtout...
Posté le 11-01-2003 à 18:10:02  profilanswer
 

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

n°284241
Dost67
Posté le 11-01-2003 à 18:51:39  profilanswer
 

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 ?

n°284248
mrbebert
Posté le 11-01-2003 à 19:02:48  profilanswer
 

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
n°284262
dropsy
et bonne chance surtout...
Posté le 11-01-2003 à 19:27:42  profilanswer
 

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

n°284267
mrbebert
Posté le 11-01-2003 à 19:33:58  profilanswer
 

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.

n°284681
Dost67
Posté le 12-01-2003 à 17:00:53  profilanswer
 

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 !

n°285997
Dost67
Posté le 14-01-2003 à 14:48:18  profilanswer
 

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.

n°286041
ethernal
Chercheur de vérité...
Posté le 14-01-2003 à 15:30:49  profilanswer
 

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

mood
Publicité
Posté le 14-01-2003 à 15:30:49  profilanswer
 

n°287760
Dost67
Posté le 16-01-2003 à 16:49:07  profilanswer
 

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
n°287767
Dost67
Posté le 16-01-2003 à 16:59:30  profilanswer
 

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.

n°287923
ethernal
Chercheur de vérité...
Posté le 16-01-2003 à 22:17:02  profilanswer
 

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

n°288529
Dost67
Posté le 17-01-2003 à 16:55:10  profilanswer
 

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 !

n°288567
ethernal
Chercheur de vérité...
Posté le 17-01-2003 à 17:21:43  profilanswer
 

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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Alléger ses requêtes mysqlfaire disparaitre des doublons dans une table
MySQL password() décrypter ??[PHP] - Insertion de balise html...
[C#] docs s/ la prog Windows en C#[PHP] Parcours répertoire : gestion du cas où il n'existe pas
Rediriger vers une page en PHP[PHP] Obtenir l'adresse IP du client?
[PHP] Passage de variables dans l'URL impossible ??? 
Plus de sujets relatifs à : PHP/MySql : quel schéma de table pour sys de gestion de docs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR