2013-08-22 5 views
2

Considérez ce tableau utilisé pour les métadonnées d'objets magasinPostgres référence UUID frais généraux

CREATE TABLE meta (
    "obj_uuid" uuid, 
    "type"  int, 
    "value"  text 
); 

Les objets sont identifiés à l'aide des clés primaires de uuid, les références de ligne de métadonnées qui uuid. Maintenant, je suis inquiet que cela fera exploser la taille de la base de données de façon exponentielle.

Est-ce que Postgres l'optimise sur lui-même, ou serait-il préférable de créer une table intermédiaire qui mappe le uuid sur un serial et référence cette série dans la table de métadonnées à la place?

+0

Si une série est adéquate, pourquoi utilisez-vous uuid? –

+0

@ClodoaldoNeto parce que l'UUID vient de CouchDB –

+0

Cette question sur DBA.StackExchange pourrait vous aider. http://dba.stackexchange.com/questions/322/what-are-the-drawbacks-with-using-uuid-or-guid-as-a-primary-key –

Répondre

3

Maintenant, je suis préoccupé par ce explosera la taille DB exponentielle

Un UUID est seulement 128 bits, par rapport à un 64 bits bigint ou 32 bits integer. Donc, votre pire casse-tête est 4x l'espace pour la clé.

Si vos paires valeur/clé sont très petites et qu'elles sont très nombreuses, cela peut poser problème. Dans ce cas, j'utiliserai une clé integer ou biginteger basée sur un sequence, puis j'utiliserai simplement uuid comme clé secondaire unique qui n'apparaît pas dans les vérifications d'intégrité référentielle.

+0

En fait, l'utilisation de UUID pourrait économiser de l'espace dans ce cas . Actuellement, il faut 64b (table principale) + 64b (PK index) + 64b (table de référence). Dans le cas vous avez suggéré qu'il faudra 32 + 64 (table principale uuid + série) 32 + 64 (index série et uniq) + 32 (table de référence). –

+0

@IgorRomanchenko Les UUID sont 128 bits, pas 64. Oui, s'il s'agissait d'une relation 1: 1 master to ref table, il n'y aurait aucun avantage, mais s'il y a beaucoup de lignes 'meta' par ligne principale, cela va commencer à faire grande différence à la hâte. Avec '128 + n * 128' vs' (128 + 32) + n * (32) ', ce dernier gagne même avec n = 1, bien que la complexité n'en vaille pas la peine jusqu'à ce que vous commenciez à avoir plusieurs méta-lignes par main rangée. Il y a un * lot * moins d'avantages si vous avez besoin des clés 'bigint' pour vos lignes principales, au point où je doute que je m'en soucie à moins d'avoir des dizaines ou des centaines de méta-rangées par ligne principale; vous avez besoin de presque n = 10 pour faire 2: 1. –

Questions connexes