Apa itu Pengidentifikasi Unik Global / Universal yang cocok untuk database PostGIS?

12

Saya telah membaca bahwa menggunakan OID sebagai kunci utama dalam postgreSQL / PostGIS db adalah praktik yang buruk karena ada contoh di mana ini dapat diatur ulang. Kedengarannya masuk akal, tapi lalu apa alternatif yang cocok? Saya percaya ada opsi untuk menggunakan UUID "Universal Unique Identifer", tetapi teks besar dan nilai angka yang dikeluarkan mengerikan.

Hanya sedikit lebih banyak latar belakang untuk situasi saya. Saya memiliki semua tabel spasial saya dibuat dengan bidang yang disebut "gid" yang merupakan kunci utama untuk tabel itu dan unik hanya untuk tabel itu. Saya memiliki masalah sekarang karena saya ingin menghubungkan tabel spasial saya (semua dengan bidang "gid" mulai dari 1 dan bertambah) ke satu tabel besar dengan informasi terkait. Tentunya agar hubungan saya berfungsi, semua fitur spasial saya memerlukan pengidentifikasi unik yang membedakan mereka satu sama lain.

Diedit Menambahkan gambar ini sesuai komentar Peters. Peter ini adalah ide yang ada di kepalaku, mungkin itu bukan cara terbaik untuk melakukannya atau bahkan mungkin bukan desain db yang baik. Saya tertarik dengan apa yang Anda pikirkan.

Diagram konseptual

Ada tips?

Ando
sumber
2
"Saya telah membaca" ... bisakah Anda memberikan tautan?
Kirk Kuykendall
1
Berikut adalah salah satu dari banyak postgresql.org/docs/8.4/static/ddl-system-columns.html ke bagian bawah halaman yang menyebutkan bahwa itu adalah praktik yang buruk untuk menganggap mereka unik. Juga tautan selanjutnya ini bytes.com/topic/postgresql/answers/423281-oid-not-oid balasan ke posting asli menyebutkan bahwa OID sudah ditinggalkan untuk tabel pengguna.
Ando
1
Bisakah Anda menambahkan beberapa detail konkret tentang skema seperti apa yang Anda coba buat. Tidak jelas bagi saya bahwa Anda perlu ID unik secara global jika Anda mengubah sedikit hubungan kunci asing, misalnya.
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. Mengapa bedanya seperti apa ID unik itu?
nmtoken
"... tapi teks besar dan nilai angka yang dikeluarkan mengerikan." Tidak, tidak. Itu hanya panjang, seperti yang diharuskan dari setiap nomor ID unik global .
jpmc26

Jawaban:

5

Aku akan membuat tabel perantara terpisah buildings_attach, parcels_attach, dll Maka Anda tidak perlu pengenal global.

Peter Eisentraut
sumber
Hai Peter, Terima kasih atas jawabannya. Saya akhirnya berhasil menghubungi DBA kami (dia berbasis di kantor lain), dia menyarankan solusi yang sama seperti Anda. Saya senang pergi ke rute itu karena saya jelas bukan orang DB (bisa jelas dari gambar skema saya?!?), Tetapi apakah itu benar-benar solusi terbaik? Apa yang terjadi jika ada lampiran yang relevan dengan fitur Parcel dan fitur bangunan? Dalam diagram saya di atas, saya hanya perlu memasukkan rincian untuk lampiran sekali, di mana sebagai solusi DBA menyarankan saya perlu melakukannya dua kali dalam dua tabel yang berbeda.
Ando
1
Ya, tetapi mereka adalah dua informasi yang terpisah, jadi tidak apa-apa untuk memasukkannya di dua tempat yang terpisah. Ini hanya cara kerja desain basis data relasional.
Peter Eisentraut
Terima kasih atas bantuan Peter, saya menghargai klarifikasi! Saya akan turun rute itu. Cheers
Ando
9

Dua solusi:

1) Buat urutan tunggal dan buat semua tabel menggunakan urutan itu, dapat dilakukan dari awal atau Anda dapat membuat kolom ID dan memperbarui tabel Anda sekarang.

Untuk membuat urutan:

CREATE SEQUENCE universal_sequence;

Lalu sebuah meja:

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

Untuk memperbarui bidang id tabel yang ada dengan ID baru (lakukan untuk semua tabel yang ingin Anda ikuti urutan yang sama):

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

2) Solusi lain: Buat urutan sementara dan mereka menjalankan kueri membuat kolom ID baru.

Lebih lanjut di sini: http://www.postgresql.org/docs/8.4/static/sql-createsequence.html

Pablo
sumber
4

Opsi terbaik adalah UUID atau GUID. Mereka dibangun untuk alasan ini, unik secara global, apa pun tabelnya. Jelek? Ya tetapi mereka adalah yang terbaik untuk situasi ini.

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

Saya telah melihat metode di mana orang menggunakan data dari tabel untuk membuat ID misalnya col1 + somestring + col2, saya benar-benar akan sangat mendukung ini (lihat di sini ). ID cerdas adalah ide yang sangat buruk.

Nathan W
sumber
0

Halo

Mengapa Anda tidak mengambil id dari tabel besar dan meletakkannya di tabel spasial?

Jika satu baris dalam salah satu tabel spasial berhubungan dengan beberapa baris dalam tabel besar saya melihat masalahnya, jika tidak, id tabel besar harus cukup, atau saya kehilangan sesuatu.

/ Nicklas

Nicklas Avén
sumber
Hai Nicklas, saya tidak bisa melakukannya dengan cara itu karena salah satu fitur spasial saya mungkin berhubungan dengan 1 atau lebih catatan dalam tabel yang lebih besar
Ando