Drei mögliche Probleme, die mir in den Sinn kommen, sind:
Mit jeder gemeinsam genutzten Ressource schaffen Sie einen potenziellen Engpass. Mein Bauch sagt, dass dies für Ihre Spitzenlast kein Problem sein sollte, aber ich empfehle dringend, eine solche Lösung in einer produktionsähnlichen Produktionsgröße zu vergleichen, um sicherzugehen.
Sie weisen Ersatzschlüsseln im Wesentlichen eine Bedeutung zu, die einen Teil ihres Zwecks in der RDB-Theorie zunichte macht. Ein Ersatzschlüssel sollte von Natur aus keine Bedeutung haben, die über die Identifizierung von Tupeln in dieser Beziehung hinausgeht. Wenn die Entitäten zusammen eine Bedeutung haben und daher kollisionsfreie Schlüssel benötigen, ist es richtig, dass sie separat modelliert werden, oder wurde etwas in den Anforderungen und / oder im Datenmodelldesign übersehen?
Sie führen einen potenziellen Fehlerpunkt ein. Was ist, wenn für eine Bereitstellung der Startpunkt für die anfängliche Sequenz nicht festgelegt wird? Sie haben dann entweder einen Fehler beim Blockieren der Bereitstellung oder die Bereitstellung beginnt an derselben Stelle, an der Ihre Funktion "beschädigt" wird. Was werden Sie auch tun, wenn irgendwo auf der ganzen Linie jemand der Meinung ist, dass es eine gute Idee ist, eine Bereitstellung zu verzweigen (in der Produktion veräußert möglicherweise ein Mandantenunternehmen einen Teil von sich selbst und muss die Daten trennen). Was ist, wenn der Startwert durch eine fehlerhafte Upgrade-Bereitstellung oder eine andere Migration zurückgesetzt wird? [0]
Wenn Sie keines dieser Probleme betrifft, wird die Idee IMO nicht zerstören. Natürlich kann es bessere Wege geben, auch wenn dieser an sich nicht falsch ist.
Wenn Sie "UUID-lite" sagen, implizieren Sie, dass Sie UUIDs bereits berücksichtigt und abgezinst haben. Ist das der Fall und wenn ja, gibt es bestimmte Gründe für die Entscheidung, dass sie für dieses Projekt nicht geeignet sind?
Ein möglicher Grund für die Nichtverwendung von UUIDs ist die Indexfragmentierung, obwohl deren Bedeutung häufig stark überbewertet ist [1] . Die Antwort von SQL Server darauf ist die "sequentielle GUID", die ziemlich genau dem entspricht, was Sie vorschlagen, wenn wir die Zuweisung von Bedeutung zu Schlüsselwerten nicht berücksichtigen - vielleicht hat postgres eine Entsprechung dazu? Natürlich können immer größere Indizes ihre eigenen Leistungsprobleme haben (Konflikte auf der letzten Seite, Indexstatistiken werden immer veralteter), und zwar bei einigen sehr spezifischen Workloads mit hohem Volumen [2] .
Ein weiteres häufiges Argument gegen UUIDs ist die Schlüssellänge: Warum 16 Bytes pro Wert verwenden, wenn 4 oder 8 ausreichen? Wenn die Einzigartigkeit wirklich eine nützliche Eigenschaft ist, wird dies in der Regel die Bedenken hinsichtlich der Schlüsselgröße erheblich übertreffen. Wenn die Schlüsselgröße ein Problem darstellt, Sie jedoch gerne eine 64-Bit-INT verwenden, anstatt innerhalb von 32-Bit zu bleiben, können Sie Ihre Technik verwenden, ohne ein potenzielles Problem mit Konflikten mit gemeinsam genutzten Ressourcen hinzuzufügen, indem Sie Ihre Idee für einen gesetzten Ganzzahlschlüssel ausführen pro Tabelle [3] unter Verwendung einer normalen INT IDENTITY(<start>, 1)
[4] Spaltendefinition, obwohl dies wiederum die Komplexität der Bereitstellung erhöht (eine kleine Menge, aber sicherlich nicht Null).
Die menschliche Lesbarkeit wird manchmal als Problem angeführt, aber das geht zurück auf die Zuweisung von Bedeutung zu Ersatzschlüsseln.
Komprimierbarkeit ist ein weniger verbreitetes Problem, auf das Sie jedoch möglicherweise stoßen. Für nahezu jeden Komprimierungsalgorithmus sehen UUIDs wahrscheinlich wie zufällige (daher nicht komprimierbare) Daten aus, es sei denn, Sie verwenden so etwas wie die sequentiellen UUIDs von SQL Server. Dies kann ein Problem für eine sehr große Anzahl von Links (oder anderen Datenblöcken) sein, die viele Entitäts-IDs enthalten, die einer Anwendung über ein langsames Netzwerk bereitgestellt werden, oder wenn Sie beispielsweise die Indexkomprimierungsfunktionen von SQL Server verwenden müssen, obwohl beides von Bedeutung ist Im Wesentlichen wird das Problem der Schlüsselgröße nur auf eine etwas andere Art und Weise neu formuliert, und auch hier können sequentielle UUIDs hilfreich sein.
[0] Dies könnte natürlich auch für normale Identitätsspalten passieren, aber da Sie eine weniger verbreitete Funktion verwenden, erhöhen Sie die Wahrscheinlichkeit eines weniger erfahrenen DBA, nachdem Sie das Problem verpasst haben, wenn es passiert, wenn Sie etwas Neues und Aufregendes tun anderswo!
[1] Ich bin ein SQL Server-Typ. Ich vermute, dass das potenzielle Problem bei Postgres dasselbe ist, aber soweit ich weiß, hat es möglicherweise ein anderes Indexlayout, das den Effekt abschwächen kann.
[2] Auch hier kann es sich um SQL Server-spezifisch handeln, insbesondere um das letztere der beiden von mir aufgelisteten Beispiele
[3] Die ersten beiden Bytes: variieren je nach Datenbank, die nächsten beiden: variieren je nach Tabelle, die restlichen vier: die inkrementierenden Bits
[4] Das ist die MS SQL Server-Syntax. Die Postgres-Syntax kann variieren, aber Sie sollten sehen, was ich meine, und in der Lage sein, zu übersetzen
tl; dr: Wenn Sie feststellen, dass Sie das Rad neu erfinden, stellen Sie sicher, dass alle vorhandenen Designs wirklich nicht geeignet sind, bevor Sie überlegen, warum ein neues möglicherweise vorhanden ist oder nicht.