O que é um identificador exclusivo global / universal adequado para um banco de dados PostGIS?


12

Eu li que o uso de OIDs como chave primária em um banco de dados postgreSQL / PostGIS é uma prática ruim, porque há casos em que eles podem ser redefinidos. Parece lógico, mas então qual é uma alternativa adequada? Acredito que haja uma opção para usar um UUID "Universal Unique Identifer", mas o valor grande do texto e número que é cuspido é horrível.

Apenas um pouco mais de fundo para a minha situação. Eu tenho todas as minhas tabelas espaciais criadas com um campo chamado "gid", que é a chave principal dessa tabela e é exclusiva apenas para essa tabela. Agora tenho um problema porque quero relacionar minhas tabelas espaciais (todas com um campo "gid" iniciando em 1 e incrementando) a uma tabela grande com as informações relacionadas. Obviamente, para que meu relacionamento funcione, todos os meus recursos espaciais precisam de um identificador único que os diferencie um do outro.

EDITADO Adicionou esta imagem conforme o comentário de Peters. Peter, esta é a idéia que tenho em minha mente, pode não ser a melhor maneira de fazer isso ou pode até não ser um bom design de banco de dados. Estou interessado no que você pensa.

Diagrama conceitual

Alguma dica?


2
"Eu li" ... você poderia fornecer um link?
22411 Kirk Kuykendall

1
Aqui está um dos muitos postgresql.org/docs/8.4/static/ddl-system-columns.html na parte inferior da página, e menciona que é uma má prática supor que eles são únicos. Além disso, este próximo link bytes.com/topic/postgresql/answers/423281-oid-not-oid uma resposta à postagem original menciona que os OIDs foram descontinuados para tabelas de usuários.
Ando

1
Você poderia adicionar mais alguns detalhes concretos de que tipo de esquema você está tentando criar. Não está claro para mim que você necessariamente precisa de um ID globalmente exclusivo se alterar um pouco os relacionamentos de chave estrangeira, por exemplo.
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 que importa a aparência do ID exclusivo?
Ntokenken

"... mas o texto grande e o valor numérico que sai são horríveis." Não, não é. É apenas longo, conforme exigido por qualquer número de identificação globalmente exclusivo .
Jpmc26

Respostas:


5

Gostaria de criar tabelas intermediárias separadas buildings_attach, parcels_attachetc. Então você não precisa de um identificador global.


Olá Peter, Obrigado pela resposta. Finalmente consegui entrar em contato com o nosso DBA (ela está sediada em outro escritório), ela sugeriu a mesma solução que você. Fico feliz em seguir esse caminho, pois definitivamente não sou uma pessoa do DB (pode ser óbvio no meu desenho de esquema?!?), Mas essa é realmente a melhor solução? O que acontece se houvesse um anexo que fosse relevante para um recurso Parcel e um recurso de construção? No meu diagrama acima, eu só precisaria inserir os detalhes do anexo uma vez, onde, como solução sugerida pelo DBA, precisaria fazê-lo duas vezes em duas tabelas diferentes.
Ando

1
Sim, mas são duas informações separadas, por isso não há problema em inseri-las em dois lugares separados. É assim que um design de banco de dados relacional funciona.
Peter Eisentraut

Obrigado pela ajuda Peter, agradeço o esclarecimento! Eu irei por esse caminho. Cheers
Ando

9

Duas soluções:

1) Crie uma única sequência e faça com que todas as tabelas usem essa sequência; isso pode ser feito desde o início ou você pode criar uma coluna de ID e atualizar suas tabelas agora.

Para criar a sequência:

CREATE SEQUENCE universal_sequence;

Então uma mesa:

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

Para atualizar um campo de ID de tabela existente com novos IDs (faça isso para todas as tabelas que você deseja seguir a mesma sequência):

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

2) A outra solução: Crie uma sequência temporária e eles executam a consulta criando uma nova coluna de ID.

Mais aqui: http://www.postgresql.org/docs/8.4/static/sql-createsequence.html


4

A melhor opção é o UUID ou GUID. Eles são criados por esse motivo, globalmente exclusivos, independentemente da tabela. Feio? Sim, mas eles são os melhores para esta situação.

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

Eu já vi métodos em que as pessoas usam dados da tabela para criar IDs, por exemplo, col1 + somestring + col2, eu realmente recomendaria isso (veja aqui ). IDs inteligentes são uma péssima idéia.


0

Hallo

Por que você não pega o ID da mesa grande e coloca as tabelas espaciais?

Se uma linha em uma das tabelas espaciais se relacionar com várias linhas na tabela grande, vejo o problema; caso contrário, o ID da tabela grande deve ser suficiente ou estou faltando alguma coisa.

/ Nicklas


Oi Nicklas, Eu não posso fazer isso dessa maneira porque um dos meus recursos espaciais pode estar relacionado a 1 ou mais registros na tabela maior
Ando
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.