PostGIS veritabanı için uygun bir Genel / Evrensel Benzersiz Tanımlayıcı nedir?


12

Ben bu sıfırlanabilir örnekleri olduğu için postgreSQL / PostGIS db birincil anahtar olarak OID'leri kullanmanın kötü uygulama olduğunu okudum. Kulağa mantıklı geliyor, ama sonra uygun bir alternatif nedir? Bir "Evrensel Benzersiz Tanımlayıcı" UUID kullanma seçeneği olduğuna inanıyorum, ancak tüküren büyük metin ve sayı değeri korkunç.

Durumum için biraz daha arka plan. Tüm uzamsal tablolarım, o tablonun birincil anahtarı olan ve sadece o tabloya özgü "gid" adında bir alanla oluşturulmuştur. Şimdi bir sorun var çünkü ben ilgili bilgiler ile büyük bir tablo ile uzamsal tablolarım (tüm 1 "başlayan ve artan" gid "alanıyla) ilişkilendirmek istiyorum. Açıkçası ilişkimin çalışması için tüm mekansal özelliklerimin birbirinden farklı olan benzersiz bir tanımlayıcıya ihtiyacı var.

EDITED Bu resmi Peters'ın yorumuna göre ekledi. Peter bu benim kafamda bir fikir, bu konuda gitmek için en iyi yolu olmayabilir ya da iyi db tasarımı bile olmayabilir. Ne düşündüğünle ilgileniyorum.

Kavramsal diyagram

Herhangi bir ipucu?


2
"Ben okudum" ... link verebilir misiniz?
Kirk Kuykendall

1
İşte birçok postgresql.org/docs/8.4/static/ddl-system-columns.html sayfanın en altına doğru, benzersiz olduklarını varsaymanın kötü bir uygulama olduğunu belirtiyor. Ayrıca bu sonraki bağlantı bytes.com/topic/postgresql/answers/423281-oid-not- Orijinal gönderiye yanıt vermemek için OID'lerin kullanıcı tabloları için kullanımdan kaldırıldığından bahsediyor.
Ando

1
Ne tür bir şema oluşturmaya çalıştığınıza dair birkaç somut ayrıntı daha ekleyebilir misiniz? Örneğin, yabancı anahtar ilişkilerini biraz değiştirirseniz, genel olarak benzersiz bir kimliğe ihtiyacınız olduğu açık değildir.
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. Benzersiz kimliğin neye benzediği neden önemlidir?
nmtoken

“... ama tüküren büyük metin ve sayı değeri korkunç.” Hayır değil. Global olarak benzersiz herhangi bir kimlik numarasının gerektirdiği gibi sadece uzun .
jpmc26

Yanıtlar:


5

Ayrı aracı tablolar buildings_attach, parcels_attachvb. Oluştururdum. O zaman global bir tanımlayıcıya ihtiyacınız yoktur.


Merhaba Peter, Yanıtınız için teşekkürler. Sonunda DBA'mızla (başka bir ofise dayanıyor) iletişim kurmayı başardım, o da seninle aynı çözümü önerdi. Kesinlikle bir DB kişi değilim gibi bu rotaya gitmek için mutluyum (benim şema çizim açık olabilir?!?), Ama bu gerçekten en iyi çözüm? Hem Parsel özelliği hem de bina özelliği ile ilgili bir ek varsa ne olur? Yukarıdaki şemamde, ekin ayrıntılarını yalnızca bir kez girmem gerekecekti, burada DBA'nın önerdiği gibi, iki farklı tabloda iki kez yapmam gerekecekti.
Ando

1
Evet, ancak iki ayrı bilgi parçası olduğundan, bunları iki ayrı yere girmek sorun değil. İlişkisel veritabanı tasarımının çalışma şekli budur.
Peter Eisentraut

Yardımın için teşekkürler Peter, açıklamayı takdir ediyorum! O rotadan ineceğim. Şerefe
Ando

9

İki Çözüm:

1) Tek bir sekans oluşturun ve tüm tabloların bu sekansı kullanmasını sağlayın, baştan yapılabilir veya bir ID sütunu oluşturabilir ve tablolarınızı şimdi güncelleyebilirsiniz.

Diziyi oluşturmak için:

CREATE SEQUENCE universal_sequence;

Sonra bir tablo:

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

Varolan bir tablo kimliği alanını yeni kimliklerle güncellemek için (aynı sırayı takip etmek istediğiniz tüm tablolar için yapın):

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

2) Diğer çözüm: Geçici bir dizi oluşturun ve yeni bir ID sütunu oluşturarak sorguyu çalıştırın.

Daha fazla bilgi için: http://www.postgresql.org/docs/8.4/static/sql-createsequence.html


4

En iyi seçenek UUID veya GUID'dir. Hangi nedenle olursa olsun, küresel olarak benzersiz olan bu nedenle inşa edilmişlerdir. Çirkin? Evet ama bu durum için en iyisi onlar.

Bkz. Https://stackoverflow.com/questions/294933/generate-unique-id-to-share-with-multiple-tables-sql-2008

Ben insanlar col1 + somestring + col2 gibi kimlikleri yapmak için tablodan veri kullandığım yöntemleri gördüm, gerçekten buna karşı savunmak istiyorum ( buraya bakın ). Akıllı kimlikler gerçekten kötü bir fikirdir.


0

alo

Neden kimliği büyük tablodan almıyorsunuz ve bunun yerine uzamsal tabloları koymuyorsunuz?

Uzamsal tablolardan birinde bir satır büyük tablodaki birden çok satır ile ilgili ise, sorunu görüyorum, aksi takdirde büyük tablo kimliği yeterli olmalı, ya da bir şey eksik miyim.

/ Nicklas


Merhaba Nicklas, bu şekilde yapamam çünkü mekansal özelliklerimden biri daha büyük tablodaki 1 veya daha fazla kayıtla ilgili olabilir
Ando
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.