Tại sao hầu hết các gói GIS cần một id số?


11

Đây là một câu hỏi đơn giản nhưng có thể gây tranh cãi: tại sao hầu hết (nếu không phải tất cả) các gói GIS yêu cầu một lớp xác định có một định danh số duy nhất không thể rỗng ?

Tại sao cần có khóa thay thế như vậy thay vì khóa tự nhiên?

Ví dụ:

  • ArcGIS thi hành OBRIID (hoặc GlobalID)

  • QGIS không tải các lớp khi chúng không có id số.


8
Một lời giải thích có thể có: một id số chiếm ít byte hơn nhiều so với id không phải là số. Điều này thậm chí còn quan trọng hơn khi bạn bắt đầu liên kết các bảng khác nhau, tất cả đều lưu một bản sao của id.
johanvdw

+1 Câu hỏi hay, tôi không nghĩ NoQuery yêu cầu khóa số.
Kirk Kuykendall


@cap Đó là một chút tiếng cười (và bạn đã đăng liên kết đó).
whuber

Câu trả lời:


6

Bởi vì họ cần phải có một trường có thể lập chỉ mục tối ưu hóa. Để lập chỉ mục một trường chuỗi nhiều lần sẽ đòi hỏi nhiều chi phí hơn và cuối cùng là không hiệu quả.

ESRI thực sự hỗ trợ trong thế giới SDE 'GLOBALID' là trường GUID, vì vậy đây là trường 32char nhưng vẫn được lập chỉ mục để tăng hiệu suất.


3
Đó là một lời giải thích tốt cho lợi thế hiệu quả của id số. Nhưng tôi nghĩ @George đang thăm dò sâu hơn thế này. Về mặt kỹ thuật, RDBMS không cần số nhận dạng của chúng là số, vậy tại sao lại phải là GIS?
whuber

1
Vấn đề ở đây không phải là nước hoa. Một khóa duy nhất không thể rỗng sẽ làm điều đó. Nhưng tại sao nó phải là số? Khi tôi đã nghe hoặc đọc rằng nó cần phải là số vì nó sử dụng khóa đó để kiểm soát kết xuất ... là trong Mô hình hóa Thế giới của chúng ta từ ESRI?
George Silva

2
Bởi vì GIS không phải là RDBMS, mặc dù nó có thể sử dụng một cái. Một hệ thống thông thường sẽ có một số quy tắc và giả định, chẳng hạn như giả định rằng khóa chính sẽ là một số nguyên được lập chỉ mục hoặc GUID, vì mục đích thực hiện và mã hóa.
blah238

1
ok, nhưng tại sao phải giả sử một số? Tại sao chúng ta có thể chọn khóa của mình khi tạo một lớp?
George Silva

1
Tôi tưởng tượng lý do chính là những giả định đó làm cho công việc viết mã làm cho gói GIS hoạt động dễ dàng hơn nhiều.
blah238

4

Nếu bạn bắt đầu thêm các bản ghi vào một lớp, bạn có thể dựa vào người dùng nhập mã chữ và số duy nhất cho mỗi tính năng mới ngay trước khi ghi nó vào đĩa ..

.. hoặc bạn có thể thực hiện một trường số nguyên tự động đơn giản.


4

Như nhiều người đã đề xuất, đó là một câu hỏi về sự thuận tiện; nhưng có lẽ sâu xa hơn, đó là quy ước.

Là một lập trình viên, bản năng đầu tiên của tôi sẽ là sử dụng khóa số cho ID lớp vì đó là cách nó luôn được thực hiện. Thật vậy, ít nhất nó có thể không xảy ra với tôi, ở một mức độ có ý thức, rằng tôi nên làm điều đó theo bất kỳ cách nào khác. Tất nhiên, nếu có lý do kỹ thuật không sử dụng số nguyên, hãy nói nếu có khả năng có nhiều lớp hơn có thể được lưu trữ trong 32 bit (một đề xuất rất khó xảy ra!), Hoặc nếu có lý do kinh doanh cho nó, sau đó lựa chọn thay thế sẽ được xem xét.

Ngoài ra còn có các xem xét thuật toán với các phím số. Sắp xếp và tìm kiếm danh sách các giá trị được sắp xếp cuối cùng sẽ đưa ra sự so sánh giữa hai số, ngay cả khi đó là danh sách các chuỗi hoặc các đối tượng phức tạp; chúng chỉ đơn thuần được biến thành số với chức năng băm . Phải nói rằng, trên các máy tính hiện đại, việc tìm kiếm một danh sách nói 100 hoặc thậm chí 1000 mặt hàng thường nhanh chóng với cách tiếp cận mạnh mẽ như với thuật toán được tối ưu hóa cao. Trong trường hợp các lớp trong một hệ thống GIS, tôi không thể nhìn thấy ngay cả những bản đồ phức tạp nhất có hơn 1000 hoặc hơn thế, và ngay cả khi có, các tính toán liên quan khác sẽ nhận được các đơn đặt hàng lớn hơn bất kỳ mức tăng nhỏ nào từ một tối ưu hóa tìm kiếm một danh sách ngắn

Các khóa số nguyên "chỉ có ý nghĩa" đối với một lập trình viên, và như Brad nói, có nhiều nỗ lực hơn trong việc sử dụng các khóa không phải là số. Có thể không nhiều mã hơn, nhưng nỗ lực tinh thần nhiều hơn, và chúng ta là những sinh vật lười biếng của thói quen. Ngoài ra, khóa xác định duy nhất một thứ giống như một lớp trong GIS được coi là "ẩn" khỏi người dùng, để đảm bảo họ không gây rối với nó và phá vỡ mã dựa trên tính duy nhất của nó (từ khóa DB UNIQUE không hiểu). Bởi vì nếu bạn cung cấp cho người dùng đủ dây, sớm muộn sẽ có người tự treo mình với nó. Bằng mọi cách, thực thi tính duy nhất trên trường có thể chỉnh sửa của người dùng, nhưng hệ thống cơ bản phải cho rằng khóa của nó là duy nhất và không bị giả mạo.


Các OpenStreetMap là một ví dụ về một dự án mà cần nhiều hơn số nguyên 32-bit. Họ sử dụng bigintcho các khóa chính của họ.
Mike T

Đối với cách / nút, có. Nhưng câu hỏi ban đầu là về các lớp trong một hệ thống GIS.
MerseyViking

OpenStreetMap lưu trữ các lớp GIS.
George Silva

OSM chỉ lưu trữ các cách và các nút có thẻ khóa / giá trị. Tùy thuộc vào hệ thống trình bày (ví dụ OpenLayers) và phụ trợ kết xuất (ví dụ: Mapnik, Osmarender) để xác định khái niệm về các lớp dựa trên các thẻ đó hoặc thứ gì khác. Nhưng Mike nói đúng, nó sử dụng bigints cho tất cả các khóa chính của bảng.
MerseyViking

+1 để đề cập đến đó là về quy ước. Đó là một quy ước bởi vì nó tương đương với hiệu suất tốt hơn.
CaptDragon

3

Câu hỏi này đã gây nhầm lẫn cho những người (như tôi), người phát triển khía cạnh cơ sở dữ liệu địa lý.

Đây không phải là giới hạn của việc lưu trữ cơ sở dữ liệu, vì PostgreSQL có thể định nghĩa các bảng với các KHÓA CHÍNH chung của các loại dữ liệu khác nhau, tuy nhiên, các bảng này không thể được tải vào các chương trình như QGIS. Trên một ghi chú lịch sử có liên quan, PostgreQuery đã từng yêu cầu một cột OID làm khóa nội bộ, cũng là một số nguyên 32 bit. Điều này được yêu cầu cho đến phiên bản 7.2 .

Yêu cầu ID số nguyên 32 bit thực sự là một giới hạn lập trình. Sẽ đơn giản hơn nhiều khi có một chỉ mục cho một tập hợp các bản ghi dưới dạng một kiểu dữ liệu cố định (số nguyên 32 bit) và thuận tiện cho việc này cũng là KHÓA CHÍNH cho bản ghi đó. Sẽ khó khăn hơn khi tạo một chương trình cho phép khóa chính tổng hợp và để nó lấy một bản ghi duy nhất dựa trên nhiều loại và / hoặc các loại dữ liệu khác nhau. Tuy nhiên, giống như OID của PostgreSQL, hạn chế này có thể được khắc phục theo thời gian phát triển. Đối với QGIS, lỗi 5 năm [bây giờ] có thể được giải quyết một ngày nào đó (đây là một số thảo luận gần đây về chủ đề này).


+1 Nói tốt. Để chứng minh thêm rằng đây là giới hạn lập trình, lưu ý rằng ESRI không yêu cầu (hoặc sử dụng) bất kỳ trường định danh nội bộ nào trong ArcView trước khi ArcGIS 8.x xuất hiện. ArcView cũ có khả năng thực hiện tất cả các hoạt động cơ sở dữ liệu mà ArcGIS thực hiện (và thực sự nhanh hơn ở nhiều trong số chúng).
whuber

2

Trong ESRI và các phần mềm GIS khác, thông thường có một thư mục hoặc tập hợp các tệp tạo trên lớp tính năng hoặc tập dữ liệu.
ví dụ: bảo hiểm arcinfo, shapefile, tập tin geodatabase.
Các "bộ" tệp này cần được "nối" bởi phần mềm để cho phép nhiều chức năng GIS.
Bảng Attrubute, mạng, điều khiển tô pô.
Đó là mục đích của OID và cũng là lý do khiến nó không bị vô hiệu hóa, bị ẩn, phần mềm được kiểm soát.


Tôi nghĩ rằng các hoạt động của GIS có thể có liên quan đến điều này, thực sự. giao nhau, (không gian) công đoàn, sự khác biệt, vv Có ai có thể xác nhận hoặc trình bày chi tiết hơn?
George Silva

Hãy xem cách một lớp tính năng SDE thực sự được lưu trữ trong cơ sở dữ liệu như Oracle. Có một bảng cho các thuộc tính, một bảng cho hình học, một bảng cho chỉ mục không gian, một hoặc nhiều bảng cho chỉ mục thuộc tính, v.v. Nếu ESRI phải hỗ trợ mọi mã hóa trang / ký tự cho chuỗi PKEY, chúng tôi sẽ tất cả vẫn còn trên ArcView 3.x.
blah238

@George - như được lưu ý bởi blah238 Có rất ít ứng dụng GIS sử dụng một tệp duy nhất để lưu trữ cả hai (tất cả) dữ liệu. Mà có thể bao gồm tọa độ, biện pháp, thuộc tính, quy tắc, mối quan hệ, và nhiều hơn nữa tùy thuộc vào gói. Nó liên quan nhiều hơn đến việc có thể theo dõi hàng không gian nào đi với hàng thuộc tính nào, hàng mạng nào, v.v.
Brad Nesom

1
Tôi xin lỗi blah238, tôi thực sự không nghĩ rằng hàng loạt mã là yếu tố quyết định trong vấn đề này. Việc bao vây không có gì để làm với điều này. Cơ sở dữ liệu sẽ thực hiện "toán học" và quyết định xem một chuỗi ký tự có bằng nhau hay không, do đó, thực thi PKEY. Nó không nằm trên lớp phần mềm. @Brad Nesom: điều đó cũng có ý nghĩa. Nhưng trong Oracle và PostGIS, bạn có thể lưu trữ tất cả các thuộc tính của mình trên một bảng. Tôi đồng ý rằng shapefiles cần ObjectID đáng sợ ... và điều đó có thể đã đặt ra tiêu chuẩn?
George Silva

@George Shapefiles không cần thiết cũng như quy tắc chung đã sử dụng ObjectID. Trường OID đó đã được giới thiệu với ArcGIS 8. Vì vậy, tôi nghi ngờ rằng các shapefile có liên quan gì đến câu hỏi không.
whuber
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.