PostGIS 데이터베이스에 적합한 글로벌 / 유니버설 고유 식별자는 무엇입니까?


12

postgreSQL / PostGIS db에서 OID를 기본 키로 사용하는 것은이를 재설정 할 수있는 인스턴스가 있기 때문에 좋지 않습니다. 논리적으로 들리지만 적절한 대안은 무엇입니까? "Universal Unique Identifer"UUID를 사용하는 옵션이 있다고 생각하지만 큰 텍스트와 숫자 값은 끔찍합니다.

내 상황에 대한 배경 지식이 조금 더 있습니다. 해당 테이블의 기본 키이며 해당 테이블에만 고유 한 "gid"라는 필드로 작성된 모든 공간 테이블이 있습니다. 공간 테이블 (모두 "gid"필드가 1부터 시작하여 증가)을 관련 정보가있는 하나의 큰 테이블에 연결하려고하므로 문제가 발생했습니다. 분명히 나의 관계가 작동하려면 모든 공간 특징이 서로 구별되는 고유 식별자가 필요합니다.

편집 됨 Peters의 의견에 따라이 이미지를 추가했습니다. Peter 이것은 내가 머릿속에 가지고있는 아이디어입니다.이 문제를 해결하는 가장 좋은 방법이 아니거나 DB 디자인이 좋지 않을 수도 있습니다. 나는 당신의 생각에 관심이 있습니다.

개념도

팁이 있습니까?


2
"읽었습니다"... 링크를 제공 할 수 있습니까?
Kirk Kuykendall

1
다음은 페이지 맨 아래 의 많은 postgresql.org/docs/8.4/static/ddl-system-columns.html 중 하나입니다. 이 페이지가 고유하다고 가정하는 것은 나쁜 습관이라고 언급합니다. 또한 다음 링크 bytes.com/topic/postgresql/answers/423281-oid-not-oid 원래 게시물에 대한 회신은 사용자 테이블에 대해 OID가 더 이상 사용되지 않는다고 언급합니다.
Ando

1
어떤 종류의 스키마를 만들려고하는지 좀 더 구체적으로 설명해 주시겠습니까? 예를 들어 외래 키 관계를 약간 변경하면 전역 적으로 고유 한 ID가 필요하다는 것은 분명하지 않습니다.
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. 고유 ID의 모양이 중요한 이유는 무엇입니까?
nmtoken

"...하지만 큰 텍스트와 숫자 값은 끔찍합니다." 아뇨. 전 세계적으로 고유 한 ID 번호 가 필요한만큼 길다 .
jpmc26

답변:


5

내가 별도의 중간 테이블을 만드는 것 buildings_attach, parcels_attach등 그럼 당신은 글로벌 식별자가 필요하지 않습니다.


안녕하세요 피터, 답변 주셔서 감사합니다. 마지막으로 DBA (다른 사무실에 근무하고 있음)와 연락을 취했으며 귀하와 동일한 솔루션을 제안했습니다. 나는 확실히 DB 사람이 아니기 때문에 그 길을 가고 기쁘다 (내 스키마 도면에서 분명 할 수 있습니까?!?), 그게 가장 좋은 해결책입니까? 구획 피쳐 및 건물 피쳐 모두와 관련된 첨부 파일이있는 경우 어떻게됩니까? 위의 다이어그램에서 첨부 파일의 세부 정보를 한 번만 입력하면 DBA가 제안한 것처럼 두 개의 다른 테이블에서 두 번 수행해야합니다.
Ando

1
예, 그러나 두 개의 별도 정보이므로 별도의 두 곳에 입력해도됩니다. 관계형 데이터베이스 디자인이 작동하는 방식 일뿐입니다.
피터 아이젠 트라우트

도움을 주셔서 감사합니다 피터, 나는 설명을 주셔서 감사합니다! 나는 그 길로 내려갈 것이다. 건배
안도

9

두 가지 솔루션 :

1) 단일 시퀀스를 작성하고 모든 테이블이 해당 시퀀스를 사용하도록하십시오. 처음부터 수행하거나 ID 열을 작성하고 테이블을 지금 업데이트 할 수 있습니다.

시퀀스를 만들려면

CREATE SEQUENCE universal_sequence;

그런 다음 테이블 :

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

기존 테이블 ID 필드를 새 ID로 업데이트하려면 (같은 순서를 따르려는 모든 테이블에 대해 수행) :

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

2) 다른 솔루션 : 임시 시퀀스를 생성하고 새 ID 열을 생성하는 쿼리를 실행합니다.

더 여기 : http://www.postgresql.org/docs/8.4/static/sql-createsequence.html


4

가장 좋은 옵션은 UUID 또는 GUID입니다. 이러한 이유 때문에 어떤 테이블에 관계없이 전 세계적으로 고유합니다. 추한? 예, 그러나이 상황에 가장 적합합니다.

참조 /programming/294933/generate-unique-id-to-share-with-multiple-tables-sql-2008를

나는 내가 (볼이에 대해 정말 adivse 정말 사람들이 ID를 예를 들어 COL1 + somestring + COL2를 만들기 위해 테이블에서 데이터를 사용하는 방법을 것이라고 보았다 여기 ). 지능형 ID는 정말 나쁜 생각입니다.


0

어이

왜 큰 테이블에서 ID를 가져 와서 대신 공간 테이블에 넣지 않습니까?

공간 테이블 중 하나의 하나의 행이 큰 테이블의 여러 행과 관련이 있으면 문제가 발생합니다. 그렇지 않으면 큰 테이블 ID가 충분하거나 무언가가 누락되었습니다.

/ 니클라스


Nicklas, 내 공간적 특징 중 하나가 더 큰 테이블에있는 하나 이상의 레코드와 관련 될 수 있기 때문에 그렇게 할 수 없습니다
Ando
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.