Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 20-05-2011 00:59:25

devlop78
Membre
Date d'inscription: 19-05-2011
Messages: 13

Question choix SGBDR et questions inhérentes

Bonjour,

Dans le cadre d'une application à développer, le client estime à plusieurs dizaines de milliers le nombre de clients enregistrés en base de données, et "15 000" personnes connectés simultanément. Sur ce dernier, j'ai des doutes, mais là n'est pas la question.

La question est assez simple ... wink ... MySQL ou PostgreSQL ? Je pense déjà viser ce dernier, mais je voulais avoir vos avis (je connais actuellement mieux MySQL que PostgreSQL bien que j'envisage d'apprendre PostgreSQL à terme, si le marché du travail m'en propose qqchose ^^).

Les questions qui suivent :

- Quelle est le plus propre :
J'ai :
-> Formulaire d'enregistrement utilisateur
-> Formulaire de connexion utilisateur

Mon "exigence" :
-> Insensible à la casse lors de la connexion

La contrainte potentielle :
-> Utilisation UTF-8 et acceptation de tous les caractères. Donc peut-être différences de casses entre langages, logiciels, etc.

Ma question finale :
-> Vaut-il mieux mettre en minuscule avec un filtre le nom d'utilisateur lors de l'inscription ET de la connexion ?
-> Vaut-il mieux ne pas changer les données et faire une requête insensible à la casse (MySQL) ou passer en minuscule juste pour la comparaison (PostgreSQL) ?
-> Les deux (???)

Disons qu'étant uniquement sous MySQL, j'ai toujours utilisé general_ci par défaut comme interclassement. Donc pas de sensibilité à la casse. Mais ce n'est peut-être pas si bien, et c'est le moment de revoir les bonnes choses. Le premier choix nécessite de se fixer des règles strictes dès le départ, et si on bouge un truc, paf ! Mais c'est pareil pour tout ... Le deuxième choix est beaucoup plus souple, mais pas forcément conseillé (après tout).

Voilà smile
Merci par avance,
Cordialement,

Hors ligne

 

#2 20-05-2011 09:31:44

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Question choix SGBDR et questions inhérentes

Bonjour,

-> Insensible à la casse lors de la connexion
Tu peux faire des requêtes "case insensitive" avec les 2 bases.

-> Utilisation UTF-8 et acceptation de tous les caractères. Donc peut-être différences de casses entre langages, logiciels, etc
Tu auras ça sans problème avec les 2 bases

-> "15 000" personnes connectés simultanément
Ca me paraît considérable, mais bon, il y a des gros sites avec ces 2 bases. Il te faudra par contre de solides compétences en tuning de base de données. Mais le problème sera le même pour les 2 bases.

-> Vaut-il mieux mettre en minuscule avec un filtre le nom d'utilisateur lors de l'inscription ET de la connexion ?
Comme tu veux, mais ça peut être géré par la base. Dans la norme SQL si je ne m'abuse, un where est de base case insensitive.

En gros pour moi les différences sont les suivantes :

Mysql :
- communauté plus grosse, beaucoup d'infos sur Internet
- un problème de gouvernance depuis le rachat de Sun par Oracle et le fork MariaDB
- des fonctionnements un peu bizarres quand on met des contraintes d'intégrités, ou qu'on utilise des procédures stockées

Postgresql :
- Plus complet et efficaces avec les fonctions étendues (contraintes d'intégrités, triggers, procédures stockées
- plus de fonctions pour construire des requêtes complexes
- communauté plus petite
- base globalement plus complexe à administrer

Je dirais que pour ton besoin elles sont équivalentes.

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#3 22-05-2011 19:30:46

devlop78
Membre
Date d'inscription: 19-05-2011
Messages: 13

Re: Question choix SGBDR et questions inhérentes

Justement, j'avais vu qu'il fallait lui préciser. Mais là, on est dans une question plus de logique que de fonctionnalité concernant la casse. Il a certainement  façons de faire les choses, mais je doute qu'il y en ai autant pour bien le faire. En gros, ma question est surtout : faire du strtolower à l'écriture ou du case-insensitive à la lecture ... Ensuite, moi je suis assez fan des CHECK j'en ai réellement besoin. Par ailleurs, je me vois mal faire un trigger pour faire un strtolower sur le pseudo. Mais c'est peut-être une question de logique. Je préfère dire à ma base : refuse tout ce qui n'est pas en minuscule. Là dessus, je suis intransigeant : de la cohérence ou rien.

C'est aussi pour ça que j'ai beaucoup de mal avec ENUM de Mysql. Je n'ai jamais compris la logique de mettre un blanc comme valeur par défaut. Ma logique est que si la valeur choisie n'est pas dans la liste (en dehors de null), elle devrait provoquer une exception. Point. Ca résout le problème d'incohérence et ça réduit les temps de débogage...

Hors ligne

 

#4 22-05-2011 19:44:56

devlop78
Membre
Date d'inscription: 19-05-2011
Messages: 13

Re: Question choix SGBDR et questions inhérentes

Concernant le where ... il est bien case sensitive. L'interclassement ne joue pas seulement sur les ORDER BY mais aussi sur cela, apparemment.

SELECT * FROM "Professeurs" WHERE username = lower('eSSai') me retourne bien la ligne avec username essai
SELECT * FROM "Professeurs" WHERE username = 'eSSai' ne me retourne rien

En y réfléchissant, il peut être intéressant que l'utilisateur retrouve son identifiant comme il l'a laissé. Donc s'il enregistre SuperMan, il peut être intéressant qu'il retrouve en se connectant "Bonjour, SuperMan", et non en minuscule. Ceci réduit le problème à zéro concernant le nom d'utilisateur, mais reste globalement une question.

Par expérience (le peu), je fais des trim() avant enregistrement. Mais je fais des htmlentities() après lecture. Il ne me viendrait plus à l'esprit de le faire avant, et je sais pourquoi. Tout comme l'absence de trim() qui viendrait influencer les validateurs qui refuseraient ce qui est acceptable, et polluerait la base de données d'espace inutile.

Concernant ce problème, ou même le cas similaire de savoir si un nom de famille doit être mis en majuscule avant insertion ou avant affichage, est assez similaire. Il est vrai qu'il dépend d'une logique, qui est : et si demain, je ne veux plus afficher les noms de famille en majuscule mais avec une lettre sur deux. Cela est donc non plus similaire mais identique à htmlentities.

Cependant, vos expériences me seraient extrêmement enrichissant, je pédale des fois des heures avant de trouver une réponse, et souvent une réponse plus palliative que vraiment absolue.

Hors ligne

 

#5 22-05-2011 21:49:08

f.garoby
Membre
Date d'inscription: 02-03-2011
Messages: 105

Re: Question choix SGBDR et questions inhérentes

Que le WHERE soit case sensitive me semble plutôt logique, c'est même l'inverse qui m'aurait inquiété !
Par contre, le LIKE lui ne l'est pas (logique). Mais faire une requête d'authentification avec un LIKE, comment dire ? :-D

Hors ligne

 

#6 23-05-2011 00:01:38

devlop78
Membre
Date d'inscription: 19-05-2011
Messages: 13

Re: Question choix SGBDR et questions inhérentes

Le LIKE chez moi est case sensitive. Pour l'authentification, je ne vois pas le problème si on supprime les "%" et les "_" avant. Mais, si demain ils sortent un nouveau joker (ou si je ne les connais pas tous), ça sera tant pis wink

Hors ligne

 

#7 23-05-2011 08:58:54

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Question choix SGBDR et questions inhérentes

en mysql la sensibilité à la case dépends du champs de la table ou de la base
pas de la requête.

pour la question MySQL PostgreSQL
je dirais que MySQL est la base idéalé pour
un contributeur de nombreux lecteurs
et PostgreSQL est plus adapté pour l'accès concurrentiel en écriture.

bon c'est une façon caricaturale de dire la chose.
si tu as un site genre Lemonde.fr
tu as quelques rédacteurs et de très nombreux lecteurs. MySQL à été pensé pour ce type d'usage. même si par la suite il s'est doté d'autres capacités cela reste son espace de prédilection. et ce même avec de très grosses bases.

PostgreSQL a pour sa part été pensé pour l'accès concurrentiel. les lock transaction etc. existent depuis l'origine. c'est une base capable de supporter de lourdes charges.

si on regarde les comparatif en terme de perf MySQL reste devant pour la lecture intensive. et PostgreSQL dès qui s'agit de transactionnel ou d'écriture intensive.

Attention dans le choix à ne pas confondre
15 000 clients de l'application web avec 15 000 connexion à la base
le moteur web est relâché et les connexions à la base mutualisées.
de plus généralement pour une appli web un seul user dans la base.

quant au login chez moi lorsque le login doit être insensible à la casse (chose que je déconseille) je fait un tolower en php sur le login que le client me fournis et je le compare à celui stocké en base
et lorsque j'enregistre un nouvel utilisateur je fait un tolower avant.

mon code est donc toujours le même quelque soit l'appli et la sensibilité à la casse est gérée au niveau du userModel en fonction d'un paramètre de conf.

du coup c'est indépendant de la base.
A+JYT

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages