2009-11-18 5 views
1

Comment puis-je générer une clé unique d'une longueur d'au plus 12 caractères avec ces attributs: Nom, nom du père, nom de la mère, date de naissance, lieu de naissance.Génération d'identifiant unique

Merci d'avance :)

+0

Un système de base de données spécifique? MySQL? Oracle? Serveur SQL? – Phil

+2

Si une paire de jumeaux s'appelle George Foreman, vous pouvez avoir des problèmes avec cette clé. –

+0

Base de données Oracle. – FlintOff

Répondre

6

Même ces colonnes ne sont probablement pas suffisantes pour être uniques, et comme le nom d'une personne peut changer (avec le mariage, le choix, etc.), je n'utiliserais généralement pas cela pour générer une clé unique.

J'utilise généralement un substitut, comme un autonumber/identité/séquence ou un UUID/GUID, en fonction des besoins.

+0

Mais j'ai besoin de générer le même nombre chaque fois que le même utilisateur entre. – FlintOff

+1

Vous pouvez générer un nombre identique pour les mêmes entrées (même une simple somme de contrôle peut le faire) - ce n'est pas un problème - éviter les collisions est le problème - même un CRC peut avoir des collisions. Un CRC 32 bits ne sera pas suffisant pour ne pas avoir de collisions si vous le faites fonctionner sur l'ensemble de la population du monde (puisqu'il ne dispose que d'un peu plus de 4 milliards d'espace). –

+0

@Database: non, vous n'avez pas besoin de générer un nombre; vous avez besoin d'une recherche de base de données qui renvoie le numéro associé à cette personne, ou en créez une nouvelle si aucune valeur n'est trouvée (et vous êtes sûr qu'il n'y a pas de fautes de frappe, d'espaces, etc.). Voir ma réponse pour plus de détails. – Galghamon

1

hmm .. quel SGBD?

Quoi qu'il en soit, concaténez les chaînes susmentionnées avec le résultat de la fonction UUID MySQL, et exécutez une fonction CRC32 sur le résultat.

Ensuite, soustrayez les 12 premiers caractères.

+0

Oracle. Et je veux faire cette clé avant de l'insérer dans la base de données. Je vais utiliser C# à l'avant. – FlintOff

+0

Si vous souhaitez créer cette clé avant qu'elle ne touche la base de données, elle cesse d'être une question de base de données. –

4

Ce n'est pas une clé que vous décrivez, mais un court morceau de données structurées que vous souhaitez utiliser à la place d'une clé. Peut-être plus utile:

- voulez-vous être en mesure de récupérer ces attributs à partir d'une clé donnée de 12 caractères?

ou

- vous serez heureux de ne générer une clé donnée ces attributs?

+0

Non, je ne veux pas récupérer ces attributs. Mais je ne veux pas correspondre à chaque fois que l'utilisateur entre son nom, le nom du père .... Je veux faire correspondre avec la clé générée. – FlintOff

2

Si vous avez besoin des mêmes attributs pour produire la même clé, concaténez tous les attributs à une chaîne, calculez un hachage SHA1 et affinez d'abord les bits 96.

Ce n'est pas garanti d'être unique, mais 50% probabilité d'une collision de hachage sera à 3.3E+14 des valeurs qui est plus que suffisant.

Si vous n'en avez pas besoin, utilisez simplement un substitut ID.

8

L'attribut principal, et en fait seulement, d'un identifiant unique est qu'il est unique (dans le cadre de la considération, que ce soit la table, le schéma, ou global). L'incorporation de valeurs du «monde réel» dans un tel identifiant n'a pas de sens.

Vous devez créer une contrainte unique sur les attributs que vous mentionnez, si vous êtes sûr que ces attributs décrivent de manière unique une personne. Cette combinaison d'attributs forme la «clé naturelle» de la table.

L'identifiant unique est une "clé de substitution", une poignée pratique qui vous évite d'avoir à spécifier toutes les colonnes de votre clé naturelle dans les jointures avec cette table. La façon dont vous obtenez un ID unique dépend de la base de données. Dans Oracle, par exemple, vous pouvez utiliser une séquence en combinaison avec un déclencheur d'insertion.

La contrainte unique sur la clé naturelle vous empêchera d'insérer deux fois la même personne, mais vous devriez d'abord vérifier la table pour voir si la personne existe déjà. Si c'est le cas, utilisez l'identifiant déjà attribué à partir de ce point. Vous pouvez, bien sûr, combiner ceci dans une procédure où vous lui donnez vos champs et il renverra l'identification, cachant l'acte de la rechercher, ou la créant si elle est nouvelle et renvoyant alors la nouvelle identification.

Questions connexes