2010-05-06 18 views
0

Si je construis une solution e-commerce multi-boutiques et que la table des commandes doit gérer un ID séquentiel en magasin, quelle est la meilleure façon de procéder?Conception de base de données gérant de manière incrémentielle le champ ID, l'évolutivité - confus

Par exemple imaginer ces ID d'ordre dans l'ordre: -

UK0001 
UK0002 
UK0003 
DE0001 
UK0004 
DE0002 

etc.

  1. par groupées ID PK MySQL/MyISAM

    • MySQL gérer automatiquement si un champ de pays et un champ ID incrémentation automatique sont utilisé. Mais MyISAM a quelques problèmes inhérents tels que le verrouillage de table et cette fonctionnalité semble que c'est fonctionnalité qui est seulement disponible dans MyISAM donc moteur de base de données en mouvement ne serait pas possible avec cette solution.
  2. Par programme. Disons que nous avons deux domaines: ORDER_ID (auto globale inc colonne PK géré par DB), NUMÉRO_COMMANDE (spécifique au pays champ ID séquentiel maintenu par code) et la table a également une colonne de shop_id associer les commandes aux commerces .

donc - après le nouvel ordre enregistrement a été créé et le moteur DB a attribué une carte d'identité au nouvel enregistrement, et le numéro de commande nouvellement créé a été récupéré dans le code comme newID variable $

select order_number+1 as new_order_number from orders where order_id < $newID and shop_id = UK order by order_id desc limit 1 

(ce code est pseudo/sql BTW)

questions:

  1. est-ce un feasi solution ble? Ou y a-t-il une meilleure façon plus efficace de le faire?

  2. Lorsque la table contient plus de 1 million d'enregistrements, le surdébit de requête supplémentaire par soumission de commande peut-il causer des problèmes ou non?

  3. Il semble qu'il y ait une chance de conflits de numéros de commande si deux commandes sont passées pour le même pays et qu'elles sont traitées simultanément. Si c'est une possibilité? si oui, y a-t-il un moyen de se protéger contre cela? (peut-être un index unique et une transaction?)

Réjouissez-vous de votre aide!

Merci

Répondre

0

Oui vous êtes certainement sur la bonne voie. Définissez le champ ORDER ID comme UNIQUE et faites exactement la même chose que vous essayiez de faire. Ajoutez une instruction catch si elle n'est pas ajoutée à cause de l'erreur UNIQUE, puis essayez de l'insérer à nouveau avec la même instruction pour vous assurer que l'ID ORDER n'est jamais inséré avec le même ID en même temps.