ทำไมแพ็คเกจ GIS ส่วนใหญ่จึงต้องมีรหัสตัวเลข


11

คำถามนี้เป็นคำถามที่เรียบง่าย แต่เป็นที่ถกเถียงกันอยู่: ทำไมแพคเกจ GIS ส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) ต้องการให้เลเยอร์ที่กำหนดมีตัวระบุตัวเลขที่ไม่ซ้ำกันและไม่สามารถลบได้?

เหตุใดจึงมีความจำเป็นที่จะต้องใช้กุญแจตัวแทนแทนคีย์ธรรมชาติ?

ตัวอย่าง:

  • ArcGIS บังคับใช้ OBJECTID (หรือ GlobalID)

  • QGIS ไม่โหลดเลเยอร์เมื่อไม่มี id ที่เป็นตัวเลข


8
คำอธิบายที่เป็นไปได้: รหัสตัวเลขใช้ไบต์น้อยกว่ารหัสที่ไม่ใช่ตัวเลข สิ่งนี้สำคัญมากขึ้นเมื่อคุณเริ่มเชื่อมโยงตารางที่แตกต่างกันซึ่งทั้งหมดเก็บสำเนาของ ID
johanvdw

+1 คำถามที่ดีฉันไม่คิดว่าNoSQLต้องใช้แป้นตัวเลข
Kirk Kuykendall


@cap นั่นมันเยาะเย้ยนิดหน่อย (และคุณได้โพสต์ลิงก์นั้นไปแล้ว)
whuber

คำตอบ:


6

เพราะพวกเขาจำเป็นต้องมีเขตข้อมูลที่สามารถจัดทำดัชนีที่ปรับให้เหมาะสม หากต้องการทำดัชนีฟิลด์สตริงซ้ำแล้วซ้ำอีกจะต้องมีค่าใช้จ่ายมากขึ้นและในที่สุดก็ไม่มีประสิทธิภาพ

ESRI สนับสนุนจริง ๆ ในโลก SDE คือ 'GLOBALID' ซึ่งเป็นเขตข้อมูล GUID ดังนั้นนี่จึงเป็นเขตข้อมูล 32char แต่ยังคงได้รับการจัดทำดัชนีเพื่อเพิ่มประสิทธิภาพ


3
นั่นเป็นคำอธิบายที่ดีสำหรับความได้เปรียบด้านประสิทธิภาพของรหัสตัวเลข แต่ฉันคิดว่า @George นั้นละเอียดกว่านี้มาก ในทางเทคนิคแล้ว RDBMS ไม่จำเป็นต้องใช้ตัวระบุเป็นตัวเลขดังนั้น GIS จึงควรทำอย่างไร
whuber

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

2
เนื่องจาก GIS ไม่ใช่ RDBMS แม้ว่าจะสามารถใช้ประโยชน์ได้ GIS มักจะมีกฎและข้อสันนิษฐานบางอย่างเช่นข้อสันนิษฐานว่าคีย์หลักจะเป็นจำนวนเต็มหรือดัชนี GUID เพื่อประสิทธิภาพการทำงานและการเข้ารหัสสติ
blah238

1
โอเค แต่ทำไมต้องคิดเป็นตัวเลข? ทำไมเราไม่สามารถเลือกกุญแจของเราเมื่อสร้างเลเยอร์
George Silva

1
ฉันคิดว่าเหตุผลหลักคือสมมติฐานเหล่านั้นทำให้การเขียนโค้ดที่ทำให้แพ็คเกจ GIS ทำงานได้ง่ายขึ้นมาก
blah238

4

หากคุณเริ่มเพิ่มระเบียนลงในเลเยอร์คุณสามารถพึ่งพาผู้ใช้ที่ป้อนรหัสตัวอักษรและตัวเลขที่ไม่ซ้ำกันสำหรับทุกคุณสมบัติใหม่ก่อนที่จะเขียนลงในดิสก์

.. หรือคุณสามารถสร้างฟิลด์จำนวนเต็มแบบอัตโนมัติได้


4

ดังที่หลายคนแนะนำว่ามันเป็นคำถามของความสะดวกสบาย แต่อาจลึกซึ้งกว่านั้นคือการประชุม

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

นอกจากนี้ยังมีข้อควรพิจารณาเกี่ยวกับอัลกอริทึมด้วยปุ่มตัวเลข การเรียงลำดับและการค้นหารายการของค่าที่เรียงลำดับจะทำให้เดือดลงไปเป็นการเปรียบเทียบระหว่างตัวเลขสองจำนวนถึงแม้ว่ามันจะเป็นรายการของสตริงหรือวัตถุที่ซับซ้อน พวกเขากลายเป็นตัวเลขด้วยฟังก์ชันการแปลงแป้นพิมพ์ ต้องบอกว่าในคอมพิวเตอร์สมัยใหม่การค้นหารายการที่มีจำนวน 100 หรือ 1,000 รายการนั้นมักจะรวดเร็วด้วยวิธีการที่ดุร้ายเหมือนอย่างที่มันเป็นด้วยอัลกอริธึมที่เหมาะสมที่สุด ในกรณีของเลเยอร์ใน GIS ฉันไม่สามารถเห็นแม้แต่แผนที่ที่ซับซ้อนที่สุดที่มีมากกว่า 1,000 หรือมากกว่านั้นและแม้ว่ามันจะเป็นเช่นนั้นการคำนวณที่เกี่ยวข้องอื่น ๆ จะใช้คำสั่งที่มีขนาดยาวกว่ากำไรเล็กน้อยจากการปรับให้เหมาะสม ค้นหารายการสั้น ๆ

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


OpenStreetMapเป็นตัวอย่างหนึ่งของโครงการที่ต้องการจำนวนเต็มมากกว่า 32 บิต พวกเขาใช้bigintสำหรับคีย์หลักของพวกเขา
Mike T

สำหรับวิธี / โหนดใช่ แต่คำถามดั้งเดิมนั้นเกี่ยวกับเลเยอร์ใน GIS
MerseyViking

OpenStreetMap เก็บเลเยอร์ GIS
George Silva

OSM เพียงเก็บวิธีและโหนดที่มีแท็กคีย์ / ค่า มันขึ้นอยู่กับระบบการนำเสนอ (เช่น OpenLayers) และแบ็กเอนด์เรนเดอร์ (เช่น Mapnik, Osmarender) เพื่อกำหนดแนวคิดของเลเยอร์ตามแท็กเหล่านั้นหรืออย่างอื่น แต่ไมค์นั้นถูกต้องมันใช้bigints สำหรับคีย์หลักของตารางทั้งหมด
MerseyViking

+1 สำหรับการพูดถึงการประชุม มันเป็นแบบแผนเพราะมันมีประสิทธิภาพที่ดีกว่า
CaptDragon

3

คำถามนี้สร้างความสับสนให้กับผู้คน (อย่างฉัน) ที่พัฒนาด้านภูมิศาสตร์ฐานข้อมูลของสิ่งต่าง ๆ

ไม่ใช่ข้อ จำกัด ของการจัดเก็บฐานข้อมูลเนื่องจาก PostgreSQL สามารถกำหนดตารางที่มีคีย์หลักคอมโพสิตที่มีชนิดข้อมูลต่างกันอย่างไรก็ตามตารางเหล่านี้ไม่สามารถโหลดลงในโปรแกรมเช่น QGIS ในบันทึกประวัติที่เกี่ยวข้อง PostgreSQL เคยต้องการคอลัมน์OIDเป็นคีย์ภายในซึ่งเป็นจำนวนเต็ม 32 บิตเช่นกัน นี้ถูกต้องจนถึงรุ่น 7.2

ความต้องการ ID จำนวนเต็ม 32 บิตเป็นข้อ จำกัด ในการเขียนโปรแกรมจริงๆ มันง่ายกว่ามากที่จะมีดัชนีชุดของระเบียนเป็นชนิดข้อมูลคงที่ (จำนวนเต็ม 32 บิต) และสะดวกสำหรับสิ่งนี้ที่จะเป็นคีย์หลักสำหรับบันทึกนั้น มันเป็นเรื่องที่ท้าทายมากขึ้นที่จะทำให้โปรแกรมอนุญาตให้ใช้คีย์หลักแบบผสมและเพื่อให้สามารถเรียกใช้ระเบียนที่ไม่ซ้ำกันตามชนิดของข้อมูลที่หลากหลายและ / หรือที่แตกต่างกัน อย่างไรก็ตามเช่นเดียวกับ OID ของ PostgreSQL ข้อ จำกัด นี้สามารถเอาชนะได้ด้วยเวลาในการพัฒนา สำหรับ QGIS ข้อผิดพลาดเก่า [ตอนนี้] 5 ปีอาจได้รับการแก้ไขในบางวัน (นี่คือการอภิปรายล่าสุดเกี่ยวกับหัวข้อ)


+1 ก็บอกว่า เป็นหลักฐานเพิ่มเติมว่านี่เป็นข้อ จำกัด การเขียนโปรแกรมโปรดทราบว่า ESRI ไม่ต้องการ (หรือใช้) ฟิลด์ตัวระบุภายในใด ๆ ใน ArcView ก่อนที่ ArcGIS 8.x จะออกมา ArcView แบบเก่านั้นมีความสามารถในการดำเนินการฐานข้อมูลทั้งหมดที่ ArcGIS ดำเนินการ (และจริง ๆ แล้วมันเร็วกว่าหลาย ๆ รายการ)
whuber

2

ใน ESRI และซอฟต์แวร์ GIS อื่น ๆ เป็นเรื่องปกติที่จะมีโฟลเดอร์หรือชุดของไฟล์ที่สร้างในคลาสคุณสมบัติหรือชุดข้อมูล
เช่นการครอบคลุม arcinfo, shapefile, ไฟล์ฐานข้อมูลภูมิศาสตร์
ซอฟต์แวร์ "ชุด" เหล่านี้จำเป็นต้อง "เข้าร่วม" โดยซอฟต์แวร์เพื่อให้สามารถใช้งานฟังก์ชั่น GIS ได้มากมาย
กำหนดตารางเครือข่ายการควบคุมทอพอโลยี
นั่นคือจุดประสงค์ของ OID และเหตุผลในการทำให้ซอฟท์แวร์ควบคุมไม่ได้


ฉันคิดว่าการปฏิบัติการ GIS อาจเกี่ยวข้องกับเรื่องนี้จริง ๆ ตัดกันสหภาพแรงงานเชิงพื้นที่ความแตกต่าง ฯลฯ ใคร ๆ สามารถยืนยันหรือนำเสนอรายละเอียดเพิ่มเติมนี้ได้ไหม
George Silva

ดูที่การจัดเก็บคุณสมบัติคลาส SDE จริงในฐานข้อมูลเช่น Oracle มีหนึ่งตารางสำหรับแอตทริบิวต์หนึ่งตารางสำหรับเรขาคณิตหนึ่งตารางสำหรับดัชนีอวกาศหนึ่งตารางขึ้นไปสำหรับดัชนีแอตทริบิวต์ ฯลฯ หาก ESRI ต้องสนับสนุนการเข้ารหัสหน้า / อักขระทุกตัวสำหรับสตริง PKEY ที่เราต้องการ ทั้งหมดยังคงอยู่ใน ArcView 3.x
blah238

@ George - ตามที่ระบุไว้โดย blah238 มีแอปพลิเคชั่น GIS น้อยมากที่ใช้ไฟล์เดียวเพื่อเก็บข้อมูล (ทั้งหมด) ซึ่งอาจประกอบด้วยพิกัดการวัดคุณลักษณะกฎความสัมพันธ์และอื่น ๆ ขึ้นอยู่กับแพ็คเกจ มันเป็นเรื่องเกี่ยวกับความสามารถในการติดตามว่าแถวอวกาศใดที่ไปกับแถวแอตทริบิวต์แถวใดแถวเครือข่ายเป็นต้น
แบรดเนสซัม

1
ฉันขอโทษ blah238 ฉันไม่คิดว่าจำนวนของรหัสเป็นปัจจัยสำคัญในปัญหานี้ การเข้ารหัสไม่มีส่วนเกี่ยวข้องกับสิ่งนี้ ฐานข้อมูลจะทำ "คณิตศาสตร์" และตัดสินใจว่าลำดับของตัวอักษรมีค่าเท่ากันหรือไม่ดังนั้นจึงบังคับใช้ PKEY มันไม่ได้อยู่ในชั้นซอฟต์แวร์ @Brad Nesom: นั่นทำให้สมเหตุสมผล แต่ใน Oracle และ PostGIS คุณสามารถจัดเก็บคุณลักษณะทั้งหมดของคุณไว้ในตารางเดียว ฉันยอมรับว่ารูปร่างไฟล์จำเป็นต้องมี ObjectID ที่หวั่น ... และนั่นอาจจะเป็นมาตรฐานหรือไม่
George Silva

@George Shapefiles ไม่จำเป็นต้องใช้หรือเป็นกฎทั่วไปใช้ ObjectID ฟิลด์ OID นั้นถูกนำมาใช้กับ ArcGIS 8 ดังนั้นฉันสงสัยว่ารูปร่างของไฟล์จะเกี่ยวข้องกับคำถาม
whuber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.