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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Question Clés Primaires MySQL pour notre cas...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Question Clés Primaires MySQL pour notre cas...

n°2059087
-BUZZ-
Posté le 23-02-2011 à 15:33:19  profilanswer
 

Bonjour,
 
Pour schématiser, notre structure repose sur 3 serveurs principaux : Un serveur Web (2003 Serveur / IIS), un serveur de BDD (2003 Serveur / MySQL), un serveur de documents (2003 server).
La problématique à laquelle nous sommes aujourd’hui confronté concerne MySQL ;
 
Nous avons actuellement une table qu’on appellera ici « table » avec environs 1 300 000 enregistrements actuellement mais qui est amenée à grossir fortement.
Elle a comme clé primaire / identifiant, un champs « idobjet » : varchar(30)
Ces « idobjet » nous sont transmis par nos clients quotidiennement.
Chaque client dispose d’une plage étendue de numéro d'objet. Lorsqu’il arrive en fin de plage il est sensé en obtenir une nouvelle…
 
Cet « idobjet» était donc sensé être unique, mais avec le temps, les clients (soumis aux contraintes d'un logiciel du fournisseur dont on a pas la main…) repartent au début de leur plage allouée.
De ce fait tous les nouveaux objet qu’ils nous transmettent ne peuvent pas être insérés en base chez nous pour cause de doublon…
 
Nous avons un certain temps pensé à utiliser comme clé primaire un id numérique en auto incrément mais le risque d’atteindre la valeur maximale est trop important il me semble.
 
Nous avons donc 2 pistes :
 
Soit, utiliser une double clé primaire sur 2 champs : « idobjet» et « date » (jour mois année) empêchant ainsi tout doublon.
(sauf en cas de réédition sur une même journée mais le cas est « impossible » en pratique et, si il y avait des doublons dans ce cas nous ne les enregistrerions pas en base à juste titre)
 
Soit, utiliser une clé primaire sur un champs unique qui serait la concaténation du champs « idobjet» et « date » séparé par un tiret par exemple.
Le principe de doublon reste le même que ci-dessus et nous conviendrai)
 
La solution 1 me semble plus « propre » mais plus lourde pour reprendre tout le code (ajout de la double clé dans toutes les requêtes)
 
La solution 2 serait plus « simple » à mettre en œuvre mais j’ai peur des performance lors de recherches ou autre sur un si grand champs…
 
Que nous conseilleriez-vous ?
MySQL lorsqu’il a une clé sur 2 champs se contente-t-il de concaténer les deux champs en question pour se former sa clé ?
 
Un grand merci par avance !

mood
Publicité
Posté le 23-02-2011 à 15:33:19  profilanswer
 

n°2059114
Nico5779
Posté le 23-02-2011 à 16:29:22  profilanswer
 

Citation :

Nous avons un certain temps pensé à utiliser comme clé primaire un id numérique en auto incrément mais le risque d’atteindre la valeur maximale est trop important il me semble.


 

Citation :

L'intervalle de validité pour les entiers non-signés est 0 à 18446744073709551615.


 
t'as de la marge encore.


---------------
Créer votre blog gratuitement
n°2059130
-BUZZ-
Posté le 23-02-2011 à 16:39:27  profilanswer
 

Effectivement, je ne pensait pas qu'on pouvait aller aussi loin à ma connaissance...
C'est l'équivalent du BigInt ?
 
Même si la marge est correcte, le problème reste possible... (je psychote oui...)
 
Je suppose que MySQL sera plus performant sur du numérique que du varchar ?

n°2059132
rufo
Pas me confondre avec Lycos!
Posté le 23-02-2011 à 16:40:04  profilanswer
 

C'est clair qu'avec un unsigned bigint, y'a de la marge. Sinon, après, y'a le système de tables partitionnées. Par ailleurs, il me semble que c'est plus performant de mettre une clé primaire sur un type entier que varchar :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2059248
Oliiii
Posté le 24-02-2011 à 08:11:44  profilanswer
 

Mieux vaut utiliser un int au lieu d'un bigint (enfin l'equivalent MySQL), ca prends 2x moins de place :)
 
INT: -2^31 (-2,147,483,648) to 2^31-1 (2,147,483,647)
La version unsigned va jusqu'a 4 millards evidement.
 
C'est pas une question de risque d'arriver a la valeur maximale, vous aurez d'autres problemes bien avant ca, en autre un probleme d'espace te de performance.
 
De plus utiliser une grande clé primaire est mauvais pour les perfs, la clé primaire se retrouve dans tous les indexes et est utilisée pour les lookups.
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Question Clés Primaires MySQL pour notre cas...

 

Sujets relatifs
MySQL/PhP - d[obj-c] Question de maths..
Charset, mysql, php et facebookQuestion optimisation
MySQL/PhP Novice - Méthode de travailCopier tables MySQL vers un autre serveur
Charset modifié entre Mysql et mes pages webParser un fichier BibTex pour l'insérer dans une bdd MySQL
Récupération de donénes mysql après upgrade[RESOLU] [MySQL] Jointures sur 3 tables
Plus de sujets relatifs à : Question Clés Primaires MySQL pour notre cas...


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