2012-02-21 3 views
1

Je suis en train de concevoir une application web utilisant une base de données MySQL, et je suis bloqué sur l'un des points précis de ma conception de base de données.MySQL AUTO_INCREMENT par groupe utilisant InnoDB ou des alternatives

Voici un exemple du type de données que je voudrais enregistrer à l'aide du moteur InnoDB:

user_id account_id 
1   1 
1   2 
1   3 
2   1 
2   2 
3   1 

Comme il ressort de ce qui précède, je voudrais le account_id à incrémentation automatique pour chaque utilisateur. Voici quelques problèmes que j'ai rencontrés:

  1. Je sais que pour ce faire, je pouvais utiliser automatiquement le moteur MyISAM, mais après que je l'ai fait un peu de lecture, je suis venu à la réalisation que lorsque les mises à jour se produisent, ce le moteur verrouillera toute la table au lieu d'une seule rangée. Ce n'est pas bon pour moi. De plus, MyISAM n'applique pas l'intégrité référentielle, ce que je voudrais garder.

  2. J'ai lu les solutions d'autres personnes à ce problème, et ils ont utilisé un déclencheur. Je pourrais, bien sûr, utiliser un déclencheur, mais je ne suis pas très friands de déclencheurs, car ils sont plus difficiles à maintenir qu'une seule table.

  3. Je pourrais probablement utiliser une séquence, mais je pense que ce serait moche de maintenir une séquence séparée pour chaque utilisateur.

  4. Je pourrais simplement utiliser un AUTO_INCREMENT unique sans tenir compte de l'id_utilisateur, ce qui fonctionnerait très bien. Il y a deux choses à ce sujet que je n'aime pas: 1. De cette façon, mon smallint pourrait devenir int ou bigint, ce qui nécessiterait beaucoup plus d'espace de stockage. Je sais que l'espace de stockage est bon marché, mais j'aimerais quand même le minimiser. 2. Il serait beaucoup plus propre d'augmenter automatiquement par groupe.

Je voudrais obtenir quelques commentaires/opinions des utilisateurs qui ont rencontré et résolu ce problème avec succès. Peut-être, il y a une autre solution à laquelle je n'ai pas pensé. Peut-être, il y a une autre façon d'organiser ma table à laquelle je n'ai pas pensé.

+2

Pour ~ 650000 utilisateurs, il est seulement une augmentation de 1.3MB si vous passer d'un 'SMALLINT' à un' INT'. Je ne vois pas de changement en un 'INT' (ou' MEDIUMINT') pourrait causer des problèmes avec le stockage des choses. L'utilisation d'une colonne d'incrémentation automatique est la meilleure idée ici. Essayez d'utiliser InnoDB si vous ne voulez pas verrouiller toute la table - IIRC ne verrouille que les lignes. – Bojangles

+0

Copie possible de [MySQL: Ajouter une colonne de séquence basée sur un autre champ] (http://stackoverflow.com/questions/1600294/mysql-add-sequence-column-based-on-another-field) – jberryman

Répondre

1

utiliser un simple AUTO_INCREMENT et ignorer le stockage:

  • Si vous changez l'échelle à un million d'utilisateurs, chacun ayant 1000 comptes, vous aurez besoin d'environ . 3 Mo de stockage supplémentaire.
  • L'avantage de la performance d'un indice primaire un seul champ (la plupart du temps trié dans le stockage réel!) Vaudra beaucoup plus, que peu de stockage
+0

Je pense que je suis maintenant convaincu que l'utilisation d'un AUTO_INCREMENT unique n'est pas si mauvaise, même si cela signifie que je dois passer de SMALLINT à INT. Je vous remercie! – Vadim