Mit UUID in CakePHP, Welchen Datentyp Wird Empfohlen?
Mein Szenario:
- Neuen Kuchen (2.x) Projekt, Keine DB Noch
- MySQL Cluster ist, und vielleicht auch Oracle Clustered Prod
- Keine DATEN migriert/importiert
- Daten können wie folgt Aussehen:
Users
-> HABTM ->Groups
-> HABTM ->Other Groups
Ich ve wurde dabei ein wenig Forschung auf, wie zu verwenden UUIDs mit CakePHP und habe Folgendes gefunden:
Kuchen hat Native Unterstützung für UUID, aber es wird davon ausgegangen CHAR(36)
:
http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html
Diese Stack Antwort weist darauf hin, dass:
Den Kosten zu tun UUID als CHAR(36) ist lächerlich hoch, und wird
dumm ist 1+ Millionen, 10 Millionen, 100+ Millionen von Zeilen, meiner bescheidenen
Erfahrung
Diese Blog-Post behauptet, dass BINARY(36)
ist besser als CHAR(36)
:
Obwohl CakePHP unterstützt keine 16-byte-hex-kodierte UUID mit
der Schlüssel Art von BINARY(16), es unterstützt das BINARY(36), die noch
besser als mit CHAR(36), die kann verlangsamt werden durch Sortierung.
...aber der Kuchen Docs nicht sagen, dass...
Meine Frage ist, da CakePHP/MySQL (oder CakePHP/Oracle), ist CHAR(36) die einzige vernünftige Wahl, oder gibt es eine bessere, effizientere Möglichkeit zur Verwendung von UUIDs mit CakePHP (oder jeder anderen PHP-Framework, für diese Angelegenheit)?
- Halten Sie im Verstand, wenn Sie
innodb
dann ist dein Primärschlüssel angehängt werden alle "index" und Sie haben erheblichen Aufwand in Indizes Größe. In der Regel die kleineren PK-Daten-Typ ist, desto besser. Und persönlich bevorzuge ich es immer ganze zahlen für Sie. - Vereinbart auf dem overhead, aber leider für die Datensätze, die diese app erstellen Sie müssen Global eindeutig sein, die nicht auf die Leistung auswirken.
- Ich bin damit einverstanden, BINÄRE ist viel leistungsfähiger als CHAR, der 3.x Weg ist hier dokumentiert: github.com/dereuromark/cakephp-shim/blob/3.0/docs/...
BINARY(16)
ist auch performant, aber die Schwierigkeiten mit der Notwendigkeit einer ausdrücklichenhex
ing undunhex
ing der Wert in der DB machen Sie es vermeiden. Durch die Art und Weise, einem alten blog-post erwähnt, dass ein quick-benchmark derCHAR(36)
vsBINARY(16)
ist hier und ich glaubeBINARY(36)
liegen irgendwo zwischen diesen beiden; evtl. mehr auf der Seite der guten 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie wahrscheinlich bereits wissen das, aber Sie könnten erzeugen eine id mit
String::uuid()
für neue Aufzeichnungen, und habenBINARY(36)
in der Tabelle - ich glaube nicht, dass Kuchen hat automagic Vergangenheit die Generierung der uuid.uuid
für primary key-Feld gemäß der Dokumentation. Obwohl Sie erwähnen, überCHAR(36)
wie der Spaltentyp in der DB ist out of the box unterstützt, die ich wirklich ZweifelBINARY(36)
funktionieren, ohne dass ein shim oder einen workaround. Ein kleiner Hinweis noch von Interesse ist, hier. Im Allgemeinen, eine Diskussion zu diesem Thema passiert ist fast 3 Jahre nach Ihrer Antwort auf githubWenn CakePHP ist gegeben ein Modell mit einem id-Feld, dessen SQL-Typ Binary(36), dann jedes mal, wenn Sie neue Datensätze erstellen, die id-Feld wird eine neue GUID-Wert. Dieses Verhalten ist hier seit der version 1.3.15.
Bezüglich deiner anderen Frage, denn CHAR betrifft die Sortierung, die ich gehen würde, für die binäre Lösung.