2009-05-08 7 views
0

Ich möchte einige menschenfreundliche Codes erstellen, um meine Objekte zu identifizieren.Datenbank-generierte menschenfreundliche Codes

Ich denke an die folgenden Regeln:

  • 6-stellige Zufallszahl
  • das erste Zeichen nicht Null
  • jeder Code hat einen edit distance Wert von 2 oder mehr * von jedem andere solcher Code
  • vielleicht eine Prüfsumme zu

würde ich meine MS SQL-Datenbank erzwingen möchten, dass die Codes, die ich verwende, sind nicht nur einzigartig, sondern entsprechen auch den oben genannten Kriterien.

Wie würde ich eine Datenbankprüfbedingung schreiben, um Regeln wie diese durchzusetzen?

Wie kann ich die Datenbank verwenden, die solche Nummern als Standardwerte für eingefügte Zeilen verwendet?

** so ein einziger Tastendruck Tippfehler werden keine andere über beabsichtigte Aufzeichnung retreive *

Antwort

1

eine gespeicherte Prozedur verwenden, um was auch immer Einschränkungen überprüfen Sie eingefügte Daten mögen.

Eine gespeicherte Prozedur kann auch verwendet werden, um diese Dinge bei Bedarf zu generieren.

Obwohl die Datenbank das alles für Sie tun zu lassen, scheint es eine gute Sache zu sein, alles auf lange Sicht zu erledigen (es sei denn, Sie haben dedizierte DBAs, die diese Art von Dingen lieben).

Ich denke, Ihre Idee und Algorithmus ist schlau. Wenn Sie mit den Anforderungen so weit gehen, würde ich sagen, eine Prüfsumme ist eine großartige Sache zu haben. Die Prüfsumme allein kann unabhängig von der Bearbeitungsentfernung Schreibfehler erfassen.

+0

Sie haben Recht. Mit einer einfachen einstelligen MOD 10-Prüfsumme, die zu einer einfachen eindeutigen Zahl hinzugefügt wurde, würde ich Bearbeitungsabstände von 2 oder mehr haben. –

1

Erstellen Sie einen gespeicherten Proc, der Ihren numerischen Wert berechnet; Verwenden Sie den gespeicherten Prozess als Wert für die Spaltendefinition in Ihrer Tabellendefinition. Hinweis: Ich habe das nicht versucht, also weiß ich nicht, ob das überhaupt möglich ist.

1

Wie viele IDs benötigen Sie?

Sie könnten die Spalte als Identitäts deklarieren, und legen Sie den Startwert auf 100.000, und die Schrittweite bis 12, dass eine sechsstellige Zahl, mit Editierdistanz von 2.

Auch produzieren würde, als Bonus Das ist ziemlich schnell. Aber Sie können die Zahlen ausgehen, da dies nicht so dicht ist.

CREATE TABLE [Items] 
(
    [id] int IDENTITY(100000,12) NOT NULL primary key, 
    [Data] varchar(50) NULL 
) 
+0

Ich muss darüber nachdenken. Ich brauche vielleicht eine andere Ziffer. –

+0

Ich würde auch lieber, dass die Zahlen in einer zufälligen Reihenfolge sind, so dass sie nicht unbeabsichtigte Informationen wie die Gesamtzahl der Datensätze bedeuten. –

0

Schreiben ein einmaliger bedienende Programm eine Tabelle aller (oder viele) möglichen gültigen Codes in einer verwürfelten Reihenfolge mit einem ganzzahligen Primärschlüssel zu bevölkern.

Codetabelle:

Id HumanFriendlyCode 

1 100124 
2 991302 
3 201463 
4 157104 
... ... 

Dann beziehen sich nur die Objekte Tabelle auf die Zeilen in dieser Codes Tabelle mit automatischer Erhöhung integer Fremdschlüssel und eine eindeutige Einschränkung.

Thing Tabelle:

Id         CodeId ... 

e9d29b14-0ea6-4cfd-a49f-44bcaa7212eb 1  ... 
91906bb7-14ed-4acc-bf23-c4bd1631797f 2  ... 
41ace075-f9f8-46b7-b114-cb17765c4e76 3  ... 
2fba1a58-7a91-4da6-a4a2-7cacef8603db 4  ... 

Wer jemals so etwas getan?

0

Diese Check-Einschränkung wird eine Prüfsumme in einer Datenbankspalte erzwingen:

ALTER TABLE tblCode 
ADD CHECK (
    CAST(SUBSTRING(CAST(Code AS VARCHAR), 6, 1) AS INTEGER) = 
    (
     CAST(SUBSTRING(CAST(Code AS VARCHAR), 1, 1) AS INTEGER) + 
     CAST(SUBSTRING(CAST(Code AS VARCHAR), 2, 1) AS INTEGER) + 
     CAST(SUBSTRING(CAST(Code AS VARCHAR), 3, 1) AS INTEGER) + 
     CAST(SUBSTRING(CAST(Code AS VARCHAR), 4, 1) AS INTEGER) + 
     CAST(SUBSTRING(CAST(Code AS VARCHAR), 5, 1) AS INTEGER) 
    ) % 10 
) 

Die sechste Ziffer 10 der Summe der ersten fünf Ziffern Modulo werden müssen.

1

Ihr Feind soweit UI geht ist die Codelänge. Ich schlage vor, dass Sie alphabetische Zeichen hinzufügen (Null, Oh, Eins und Auge weglassen). Es schneidet dann die Länge wesentlich und macht Kollisionen weniger wahrscheinlich, insbesondere für Transpositionen.