Qu'est-ce qu'un identifiant unique global / universel approprié pour une base de données PostGIS?

12

J'ai lu que l'utilisation des OID comme clé primaire dans une base de données postgreSQL / PostGIS est une mauvaise pratique car il existe des cas où ceux-ci peuvent être réinitialisés. Cela semble logique, mais alors quelle est une alternative appropriée? Je crois qu'il existe une option pour utiliser un UUID "Universal Unique Identifer", mais la grande valeur de texte et de nombre qui crache est horrible.

Juste un peu plus d'informations sur ma situation. J'ai toutes mes tables spatiales créées avec un champ appelé "gid" qui est la clé primaire de cette table et unique uniquement à cette table. J'ai un problème maintenant parce que je veux associer mes tables spatiales (toutes avec un champ "gid" commençant à 1 et incrémentant) à une grande table avec les informations associées. Évidemment, pour que ma relation fonctionne, toutes mes caractéristiques spatiales ont besoin d'un identifiant unique qui les différencie les unes des autres.

EDITÉ Ajouté cette image selon le commentaire de Peters. Peter, c'est l'idée que j'ai dans ma tête, ce n'est peut-être pas la meilleure façon de procéder ou ce n'est peut-être même pas un bon design de base de données. Je suis intéressé par ce que vous pensez.

Diagramme conceptuel

Des conseils?

Ando
la source
2
"J'ai lu" ... pourriez-vous fournir un lien?
Kirk Kuykendall
1
Voici l'un des nombreux postgresql.org/docs/8.4/static/ddl-system-columns.html vers le bas de la page, il mentionne que c'est une mauvaise pratique de supposer qu'ils sont uniques. De plus, ce lien suivant bytes.com/topic/postgresql/answers/423281-oid-not-oid une réponse à la publication d'origine mentionne que les OID sont déconseillés pour les tables utilisateur.
Ando
1
Pourriez-vous ajouter quelques détails plus concrets sur le type de schéma que vous essayez de créer. Il n'est pas clair pour moi que vous ayez nécessairement besoin d'un ID global unique si vous modifiez un peu les relations de clé étrangère, par exemple.
Peter Eisentraut
1
I believe there is an option to use a "Universal Unique Identifer" UUID, but the large text and number value that spits out is horrible. Pourquoi est-ce important à quoi ressemble l'ID unique?
nmtoken
"... mais la grande valeur de texte et de nombre qui crache est horrible." Non ce n'est pas. C'est juste long, comme cela est requis pour tout numéro d'identification unique au monde .
jpmc26

Réponses:

5

Je voudrais créer des tableaux intermédiaires séparés buildings_attach, parcels_attachetc. Ensuite , vous n'avez pas besoin d' un identificateur global.

Peter Eisentraut
la source
Salut Peter, Merci pour la réponse. J'ai finalement réussi à entrer en contact avec notre DBA (elle est basée dans un autre bureau), elle a proposé la même solution que vous. Je suis heureux d'emprunter cette voie car je ne suis certainement pas une personne DB (cela pourrait être évident d'après mon schéma?!?), Mais est-ce vraiment la meilleure solution? Que se passe-t-il s'il y avait une pièce jointe pertinente à la fois pour une entité parcellaire et une entité de construction? Dans mon diagramme ci-dessus, je n'aurais qu'à entrer les détails de la pièce jointe une fois, alors que la solution suggérée par le DBA, je devrais le faire deux fois dans deux tableaux différents.
Ando
1
Oui, mais ce sont deux informations distinctes, il est donc normal de les saisir à deux endroits distincts. C'est juste la façon dont une conception de base de données relationnelle fonctionne.
Peter Eisentraut
Merci pour l'aide Peter, j'apprécie la clarification! Je vais emprunter cette voie. Cheers
Ando
9

Deux solutions:

1) Créez une séquence unique et faites en sorte que toutes les tables utilisent cette séquence, cela peut être fait depuis le début ou vous pouvez créer une colonne ID et mettre à jour vos tables maintenant.

Pour créer la séquence:

CREATE SEQUENCE universal_sequence;

Puis un tableau:

CREATE TABLE (
colname integer NOT NULL DEFAULT nextval('universal_sequence'));

Pour mettre à jour un champ d'ID de table existant avec de nouveaux ID (faites-le pour toutes les tables que vous souhaitez suivre la même séquence):

UPDATE table1
SET id=nextval('universal_sequence'));

2) L'autre solution: créez une séquence temporaire et exécutez la requête en créant une nouvelle colonne ID.

Plus ici: http://www.postgresql.org/docs/8.4/static/sql-createsequence.html

Pablo
la source
4

La meilleure option est l'UUID ou le GUID. Ils sont construits pour cette raison, uniques au monde, quelle que soit la table. Laid? Oui mais ils sont les meilleurs pour cette situation.

Voir /programming/294933/generate-unique-id-to-share-with-multiple-tables-sql-2008

J'ai vu des méthodes où les gens utilisent les données de la table pour faire des identifiants, par exemple col1 + somestring + col2, je m'y opposerais vraiment (voir ici ). Les identifiants intelligents sont une très mauvaise idée.

Nathan W
la source
0

Bonjour

Pourquoi ne prenez-vous pas l'identifiant de la grande table et ne placez-vous pas les tables spatiales à la place?

Si une ligne dans l'une des tables spatiales se rapporte à plusieurs lignes dans la grande table, je vois le problème, sinon l'ID de la grande table devrait être suffisant, ou suis-je en train de manquer quelque chose.

/ Nicklas

Nicklas Avén
la source
Salut Nicklas, je ne peux pas le faire de cette façon car une de mes caractéristiques spatiales peut être liée à un ou plusieurs enregistrements dans le tableau plus grand
Ando