Global / Universal Unique Identifier ที่เหมาะสมสำหรับฐานข้อมูล PostGIS คืออะไร


12

ฉันได้อ่านว่าการใช้ OID เป็นคีย์หลักในฐานข้อมูล postgreSQL / PostGIS นั้นเป็นวิธีปฏิบัติที่ไม่ดีเนื่องจากมีกรณีที่สามารถรีเซ็ตสิ่งเหล่านี้ได้ ฟังดูมีเหตุผล แต่แล้วอะไรคือทางเลือกที่เหมาะสม ฉันเชื่อว่ามีตัวเลือกให้ใช้ UUID "Universal Unique Identifer" แต่ตัวอักษรและตัวเลขจำนวนมากที่คายออกมานั้นน่ากลัว

พื้นหลังเพิ่มเติมเล็กน้อยกับสถานการณ์ของฉัน ฉันมีตารางเชิงพื้นที่ของฉันทั้งหมดที่สร้างขึ้นด้วยเขตข้อมูลที่เรียกว่า "gid" ซึ่งเป็นคีย์หลักสำหรับตารางนั้นและไม่ซ้ำกับตารางนั้นเท่านั้น ฉันมีปัญหาในขณะนี้เพราะฉันต้องการที่จะเชื่อมโยงตารางเชิงพื้นที่ของฉัน (ทั้งหมดที่มีเขตข้อมูล "gid" เริ่มต้นที่ 1 และเพิ่มขึ้น) เป็นหนึ่งตารางขนาดใหญ่ที่มีข้อมูลที่เกี่ยวข้อง เห็นได้ชัดว่าสำหรับความสัมพันธ์ของฉันในการทำงานคุณสมบัติเชิงพื้นที่ทั้งหมดของฉันต้องการตัวระบุที่ไม่ซ้ำซึ่งแตกต่างจากที่อื่น

แก้ไขเพิ่มรูปภาพนี้ตามความคิดเห็นของ Peters Peter นี่เป็นความคิดที่ฉันมีในหัวของฉันมันอาจไม่ใช่วิธีที่ดีที่สุดที่จะไปเกี่ยวกับเรื่องนี้หรืออาจไม่ใช่การออกแบบฐานข้อมูลที่ดี ฉันสนใจในสิ่งที่คุณคิด

แผนภาพแนวคิด

เคล็ดลับใด ๆ


2
"ฉันอ่านแล้ว" ... คุณสามารถให้ลิงค์ได้หรือไม่?
Kirk Kuykendall

1
นี่เป็นหนึ่งในpostgresql.org/docs/8.4/static/ddl-system-columns.htmlทางด้านล่างของหน้าเว็บที่กล่าวถึงว่าเป็นวิธีปฏิบัติที่ไม่ดีที่จะถือว่าพวกเขามีเอกลักษณ์ นอกจากนี้ลิงค์ต่อไปนี้bytes.com/topic/postgresql/answers/423281-oid-not-oidการตอบกลับไปยังโพสต์ต้นฉบับที่กล่าวถึงว่า OIDs ถูกคัดค้านสำหรับตารางผู้ใช้
Ando

1
คุณช่วยเพิ่มรายละเอียดที่เป็นรูปธรรมของสคีมาที่คุณพยายามสร้างได้ไหม มันไม่ชัดเจนสำหรับฉันว่าคุณจำเป็นต้องมีรหัสเฉพาะทั่วโลกหากคุณเปลี่ยนความสัมพันธ์กับคีย์ต่างประเทศเล็กน้อย
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
ใช่ แต่มันเป็นข้อมูลสองส่วนที่แยกกันดังนั้นจึงเป็นการดีที่จะป้อนข้อมูลเหล่านั้นในที่แยกต่างหากสองแห่ง เป็นเพียงวิธีการออกแบบฐานข้อมูลเชิงสัมพันธ์
Peter Eisentraut

ขอบคุณสำหรับความช่วยเหลือปีเตอร์ฉันขอขอบคุณการชี้แจง! ฉันจะไปตามทางนั้น ไชโย
Ando

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

ฉันได้เห็นวิธีการที่ผู้คนใช้ข้อมูลจากตารางเพื่อสร้างรหัสเช่น col1 + somestring + col2 ฉันจะ adivse จริงๆกับเรื่องนี้ (ดูที่นี่ ) รหัสอัจฉริยะเป็นความคิดที่ไม่ดีจริงๆ


0

สวัสดี

ทำไมคุณไม่นำไอดีออกมาจากโต๊ะตัวใหญ่และวางลงในตารางอวกาศแทน?

หากหนึ่งแถวในตารางอวกาศหนึ่งตารางเกี่ยวข้องกับหลายแถวในตารางใหญ่ฉันเห็นปัญหาไม่เช่นนั้น id ตารางใหญ่ควรจะเพียงพอหรือฉันขาดอะไรไป

/ Nicklas


สวัสดี Nicklas ฉันไม่สามารถทำเช่นนั้นได้เพราะหนึ่งในคุณสมบัติเชิงพื้นที่ของฉันอาจเกี่ยวข้องกับ 1 หรือมากกว่าหนึ่งระเบียนในตารางขนาดใหญ่
Ando
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.