2011-07-28 4 views
2

J'ai utilisé MongoDB avec C#, et j'ai utilisé ObjectIds, puis les GUID plus tard pour mes ID d'entité. Je déteste regarder ces Id, je pense que c'est contre-intuitif ... J'aimerais vraiment pouvoir utiliser des entiers ou des longs, comme des DB relationnelles Identity column. Mais j'ai du mal à trouver un moyen de le faire. Si j'utilise collection max + 1, cela conduira à des conditions de course. J'ai lu sur l'utilisation d'un algorithme Hi-Lo Generator, mais comment cela fonctionne-t-il? Que faire si j'ai 10 serveurs d'application exécutant le même code? Cela signifie-t-il que je dois avoir 10 gammes d'identité hi lo par collection?C# - Générer "identité" comme Id avec NoSQL (MongoDB)?

Si quelqu'un peut me diriger vers un algorithme C# pour partager ce serait génial! J'ai vu RNGCryptoServiceProvider d'ailleurs, mais cela n'est pas garanti pour être unique, et ce n'est pas une identité int/long séquentielle. Je préfère utiliser Salut-Lo à ce moment-là ...

Merci, Tim

Répondre

4

Vous pouvez écrire votre propre générateur d'identifiants et l'utiliser. Here vous pouvez trouver comment. Mais ObjectId a été conçu pour être unique sur l'ensemble des fragments/ensembles de réplicas. Ainsi, chaque fragment peut générer un identifiant unique indépendamment des autres. Avec int id dans la base de données distribuée, vous aurez beaucoup de problèmes.

+0

J'ai créé une implémentation de ceci ici: https://github.com/alexjamesbrown/MongDBIntIdGenerator - c'est un travail en cours, et a besoin de plus de tests etc ... mais c'est un début – Alex

1

Guids peuvent ne pas être joli à regarder, mais ils sont testés et jugés.

Vous pouvez faire tout ce que vous pouvez pour éviter les collisions sur les séquences entières, mais à la fin, je pense que vous verrez que cela n'en vaut pas la peine. Cela est particulièrement vrai pour les environnements distribués qui ont tendance à changer avec le temps.

+0

J'ai la réponse mis à la réponse ci-dessous car il avait un lien vers un générateur, mais tous les deux sont corrects ... Je devrais simplement revenir à Guid ou ObjectId, et arrêter de penser à des Id entiers relationnels. – Tim

-1

Ceci est du chemin à parcourir: github.com/alexjamesbrown/MongDBIntIdGenerator

+1

Cela ne marchera pas dans le cas d'insertions concurrentes ou si les documents sont supprimés. – JohnnyHK

+0

oui, de bons points. – malibeg

Questions connexes