2009-08-07 9 views
2

Une exigence est que lorsque je persiste mes objets C# dans la base de données, je dois déterminer l'ID de la base de données (clé primaire de substitution) dans le code.Génération d'ID de base de données uniques dans le code

La deuxième exigence est que le type de base de données pour la clé doit être int ou char (x) ... donc pas d'identificateur unique ou binaire (16) ou similaire.

Ce sont des exigences inchangeables.

Quelle serait la meilleure façon de gérer cela?

Une idée est les GUID codés en base64 ressemblant à "XSiZtdXcKU68QWe7N96Dig". Ceux-ci sont facilement créés dans le code et sont acceptables dans les URL si nécessaire. Mais sera-t-il trop cher en ce qui concerne les performances (indexation, taille), toutes les clés primaires et étrangères étant char (22)? En dehors de la main, j'aime vraiment cette idée.

Une autre idée serait de créer une version de code d'une séquence de base de données en créant des entiers incrémentés pour moi. Mais je ne sais pas si cela est plausible et aurait besoin de conseils pour assurer la fiabilité. Le séquenceur doit savoir har loin il est venu et qu'en est-il des threads que je ne contrôle pas

J'imagine qu'aucune table impliquée dépassera jamais 1.000.000 lignes ... sera probablement beaucoup moins.

+1

Cela n'a vraiment aucun sens - c'est vraiment le travail de la base de données, pourquoi essayer de déplacer cela vers le code client? Tout code client sera sujet aux erreurs (doublons possibles) - seule la base de données peut réellement garantir l'unicité –

+3

Puis-je vous demander de clarifier pourquoi l'exigence est de décider de l'identifiant unique dans le code? Neuf fois sur dix, j'ai trouvé que la solution à ce problème consistait à contourner cette exigence et à laisser la base de données faire son travail. –

+1

Je connais toutes les discussions et n'ai aucune envie de justifier :). Je pose une question basée sur les exigences immuables mentionnées pour répondre s'il vous plaît en conséquence. – lox

Répondre

0

Un simple incrémentation serait le moyen le plus simple d'assurer l'unicité. C'est ce que fera la base de données si vous le permettez. Si vous définissez la ligne du tableau sur auto_increment, la base de données le fera automatiquement pour vous. Cela ne pose aucun problème de sécurité, mais puisque vous le manipulez vous-même au lieu de laisser le moteur de base de données s'en occuper, vous devez vous assurer que vous ne générez pas le même identifiant deux fois. Cela devrait être simple si vous êtes sur un système à un seul thread, mais si votre programme est distribué, vous devrez faire un effort pour assurer l'unicité.

0

Voyant que vous avez une application ASP.NET, vous pouvez effectuer les opérations suivantes (en espérant et en supposant que tous les utilisateurs doivent s'authentifier avant d'utiliser votre application!):

  • attribuer à chaque utilisateur un unique « UserID » dans votre base de données (peut être INT ou CHAR)
  • attribuer à chaque utilisateur un « HighestSequentialID » (INT) dans votre base de données
  • Lorsque l'utilisateur se connecte, lisez les valeurs de la base de données et de les stocker dans par exemple un principal personnalisé, ou dans un cookie, ou autre chose
  • chaque fois que l'utilisateur est sur le point d'insérer une ligne, créez un ID segmenté: (UserID). (numéro séquentiel de l'utilisateur) et stockez-le comme "VARCHAR (20)" - par exemple Votre ID utilisateur est 15 et les entrées de cet utilisateur ont donc des ID uniques de "15.00001", "15.00002" et ainsi de suite.
  • lorsque l'utilisateur se déconnecte (ou à tout autre moment), mettre à jour son nouveau, ID séquentiel le plus utilisé dans la base de données afin que la prochaine fois, vous saurez ce que cet utilisateur a utilisé la dernière

Encore une fois - vous devrez faire beaucoup plus de travaux ménagers vous-même, et il est toujours sujet à une mésaventure (attribution d'un ID utilisateur en double, ou mauvaise interprétation du plus grand nombre séquentiel pour cet utilisateur).

Je vous recommande vivement d'essayer de faire évoluer ces exigences - avec ces dernières, toutes les solutions seront au mieux sous-optimales, tandis que l'utilisation de la base de données pour gérer cela serait totalement indolore.

Marc

1

Vous pourriez avoir une table appelée "séquences". Pour chaque table il y aurait une rangée avec un compteur. Ensuite, lorsque vous avez besoin d'un autre numéro, récupérez-le dans la table du compteur et augmentez-le. Mettez-le dans une transaction et vous aurez l'unicité.

Cependant, cela va souffrir en termes de performance, bien sûr.

+0

Et c'est encore sur la base de données - qui selon l'OP, il ne peut pas toucher lors de la création de l'ID unique .... –

+0

Ah, eh bien ... alors non, je suppose. : P –

0

Pour un tableau ci-dessous 1.000.000 lignes, je ne serais pas trop préoccupé par une clé primaire char (22). Bien sûr, la solution idéale pour une situation comme celle-ci serait que chaque objet ait quelque chose d'unique à ce sujet que vous puissiez exploiter pour la clé, même s'il s'agit d'une clé en plusieurs parties. La prochaine solution idéale serait de faire changer les exigences :)

Questions connexes