2009-04-25 4 views
4

Dans une base de données non partitionnée, je pouvais simplement utiliser l'incrémentation automatique pour générer un identifiant unique pour référencer une ligne spécifique.Comment créer un ID de ligne unique dans des bases de données partagées?

Je veux partitionner ma base de données, disons en 12 partitions. Maintenant, lorsque je l'insère dans un fragment spécifique, l'ID d'incrémentation automatique n'est plus unique.

Vous aimeriez entendre l'expérience de quelqu'un face à ce problème.

+0

jamais entendu le terme sharding avant - merci d'ajouter à mon vocabulaire – MrTelly

Répondre

9

Quelques approches

1) Donnez à chaque tesson son propre ID, et utiliser une clé composite

2) Donnez à chaque tesson son propre ID et ID définir les plages pour chaque tesson

3) utiliser un identifiant globalement unique - GUID

+3

Utilisez le GUID et ne vous inquiétez pas sur les plages et la clé composite. À un certain moment, vous ajouterez inévitablement un autre fragment ou un besoin de réorganiser vos fragments et votre schéma de numérotation devra être refactorisé. –

+1

@Jeff: Les GUID ont un sérieux inconvénient, ils sont grands. Selon la raison de la division du DB, cela pourrait être un facteur important. L'utilisation de plages d'identifiants permet une PK à un seul champ (32 bits) sans collisions entre les différents DB. Donc, je suis d'accord que si le volume n'est pas un problème, utilisez les GUID, mais ils ne sont pas toujours appropriés. Cela aide si l'on ne lie pas l'identité de la DB de création avec l'ID. De cette façon, les DB peuvent «louer» des plages d'ID qui éliminent les problèmes de «refactoring». – AnthonyWJones

+0

Personnellement, je déteste les GUID en tant que clés, comme vous ne pouvez pas crier - regardez l'enregistrement 123456, les GUID sont anti-humains – MrTelly

1

1) Il est possible deux rangées (on indique l'identifiant et le second identifiant la base de données)

2) utiliser Guids

+0

Aviez-vous l'intention de dire 2 colonnes au lieu de 2 lignes dans votre première option? – codingpuss

2

Les deux approches que j'ai l'habitude de ce genre de problème:

  • GUID: Facile à mettre en œuvre, crée de plus grandes tables et des index bien.
  • ID Domaine: J'ai fait ce terme, mais, fondamentalement, cela signifie diviser les 32 (ou 64) bits d'un type entier en deux parties, la partie supérieure représente un domaine. Le nombre de bits à utiliser pour le domaine dépend du nombre de domaines que vous souhaitez prendre en charge et du nombre d'enregistrements que vous attendez d'un seul domaine. Dans cette approche, vous attribuez un domaine à chaque fragment. L'inconvénient est DBs (que je connais) ne supportent pas cette approche directement, vous devez coder l'attribution ID vous-même.
+0

Voudriez-vous s'il vous plaît regarder dans cette question: http://stackoverflow.com/questions/9237165/which-of-the-following-data-duplication-options-across-shards-is-recommandé Merci –

0

J'ai le même dilemme. Je pense que je vais aller avec une solution Redis. Je vais utiliser un service comme redis-cloud.com pour générer des identifiants uniques. Donc, je peux toujours utiliser bigint pour toutes les données insérées dans ma table partitionnée. L'IT sera séquentiel, donc aucune division de page ne se produira. De plus, la pagination est maintenant très facile à faire. Il me résout le problème des URLs amicales parce que je ne voulais pas utiliser un GUID dans l'URL. De plus, Redis Cloud est une solution évolutive, très fiable et à basculement automatique.

Je n'ai pas besoin de décider d'une plage pour diviser mes données, j'utilise simplement le hachage MD5 sur la clé primaire pour diviser les données de manière égale entre les fragments. Pour HA, j'ai décidé d'utiliser Amazon RDS pour la sauvegarde/restauration et la réplication ponctuelles.

Je pense que Flickr utilise la même technique, mais ils ont deux générateurs, un pour les nombres impairs et un autre pour les nombres pairs.

Questions connexes