¿Cuál es un identificador único global / universal adecuado para una base de datos PostGIS?

12

He leído que usar OID como clave principal en una base de datos postgreSQL / PostGIS es una práctica deficiente porque hay casos en los que se pueden restablecer. Suena lógico, pero ¿cuál es una alternativa adecuada? Creo que hay una opción para usar un UUID "Universal Unique Identifer", pero el texto grande y el valor numérico que escupe es horrible.

Solo un poco más de antecedentes de mi situación. Tengo todas mis tablas espaciales creadas con un campo llamado "gid", que es la clave principal para esa tabla y única solo para esa tabla. Ahora tengo un problema porque quiero relacionar mis tablas espaciales (todas con un campo "gid" que comienza en 1 e incrementando) a una tabla grande con la información relacionada. Obviamente, para que mi relación funcione, todas mis características espaciales necesitan un identificador único que las diferencie entre sí.

EDITADO Agregó esta imagen según el comentario de Peters. Peter, esta es la idea que tengo en mi cabeza, puede que no sea la mejor manera de hacerlo o incluso no sea un buen diseño de base de datos. Estoy interesado en lo que piensas.

Diagrama conceptual

¿Algun consejo?

Ando
fuente
2
"He leído" ... ¿podría proporcionar un enlace?
Kirk Kuykendall
1
Aquí hay uno de los muchos postgresql.org/docs/8.4/static/ddl-system-columns.html hacia la parte inferior de la página que menciona que es una mala práctica asumir que son únicos. También en el siguiente enlace bytes.com/topic/postgresql/answers/423281-oid-not-oid, una respuesta a la publicación original menciona que los OID están en desuso para las tablas de usuario.
Ando
1
¿Podría agregar algunos detalles más concretos de qué tipo de esquema está tratando de crear? No está claro para mí que necesariamente necesite una identificación global única si cambia un poco las relaciones de clave externa, por ejemplo.
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. ¿Por qué importa cómo se ve la identificación única?
nmtoken
"... pero el texto grande y el valor numérico que escupe es horrible". No, no es. Es largo, como se requiere de cualquier número de identificación único a nivel mundial .
jpmc26

Respuestas:

5

Me gustaría crear tablas intermedias separadas buildings_attach, parcels_attachetc. Entonces no es necesario un identificador global.

Peter Eisentraut
fuente
Hola Peter, gracias por la respuesta. Finalmente logré ponerme en contacto con nuestro DBA (ella se encuentra en otra oficina), sugirió la misma solución que usted. Estoy feliz de seguir ese camino, ya que definitivamente no soy una persona DB (¿podría ser obvio por mi esquema de dibujo?!?), ¿Pero es realmente la mejor solución? ¿Qué sucede si había un archivo adjunto que era relevante tanto para una característica de Parcela como para una característica de construcción? En mi diagrama anterior, solo necesitaría ingresar los detalles para el archivo adjunto una vez, donde, como solución, el DBA sugirió que tendría que hacerlo dos veces en dos tablas diferentes.
Ando
1
Sí, pero son dos piezas de información separadas, por lo que está bien ingresarlas en dos lugares separados. Es la forma en que funciona un diseño de base de datos relacional.
Peter Eisentraut
Gracias por la ayuda Peter, agradezco la aclaración! Iré por esa ruta. Saludos
Ando
9

Dos soluciones:

1) Cree una secuencia única y haga que todas las tablas usen esa secuencia, se puede hacer desde el principio o puede crear una columna de ID y actualizar sus tablas ahora.

Para crear la secuencia:

CREATE SEQUENCE universal_sequence;

Luego una mesa:

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

Para actualizar un campo de id. De tabla existente con nuevos ID (hágalo para todas las tablas que desea seguir la misma secuencia):

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

2) La otra solución: crear una secuencia temporal y ejecutar la consulta creando una nueva columna de ID.

Más aquí: http://www.postgresql.org/docs/8.4/static/sql-createsequence.html

Pablo
fuente
4

La mejor opción es el UUID o GUID. Están construidos por este motivo, globalmente únicos, sin importar qué tabla. ¿Feo? Sí, pero son los mejores para esta situación.

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

He visto métodos en los que las personas usan datos de la tabla para hacer ID, por ejemplo, col1 + somestring + col2, realmente me gustaría adivinar esto (ver aquí ). Las ID inteligentes son una muy mala idea.

Nathan W
fuente
0

Hola

¿Por qué no tomas la identificación de la tabla grande y la pones en las tablas espaciales?

Si una fila en una de las tablas espaciales se relaciona con varias filas en la tabla grande, veo el problema; de lo contrario, la ID de la tabla grande debería ser suficiente, o me falta algo.

/ Nicklas

Nicklas Avén
fuente
Hola Nicklas, no puedo hacerlo de esa manera porque una de mis características espaciales puede estar relacionada con 1 o más registros en la tabla más grande
Ando