Чому для більшості пакетів GIS потрібен числовий ідентифікатор?


11

Це просте, але можливо суперечливе запитання: чому більшість (якщо не всі) GIS-пакетів вимагають, щоб певний рівень мав унікальний ненульовий числовий ідентифікатор?

Чому існує необхідність у такому сурогатному ключі замість природного?

Приклади:

  • ArcGIS застосовує OBJECTID (або GlobalID)

  • QGIS не завантажує шари, коли у них немає числового ідентифікатора.


8
Можливе пояснення: числовий ідентифікатор займає набагато менше байтів, ніж нечисловий ідентифікатор. Це важливо ще більше, коли ви починаєте зв’язувати різні таблиці, в яких зберігається копія ідентифікатора.
johanvdw

+1 Добре запитання, я не думаю, що NoSQL не потребує числових клавіш.
Кірк Куйкендалл


@cap Це невеличкий фрагмент (і ви вже опублікували це посилання).
whuber

Відповіді:


6

Тому що вони повинні мати оптимізоване поле, що індексується. Для індексації рядкового поля знову і знову знадобиться більше накладних витрат і, врешті-решт, це не так ефективно.

ESRI насправді підтримує у світі SDE 'GLOBALID', що є GUID-полем, тому це 32-метрове поле, але все ще індексується для підвищення продуктивності.


3
Це хороше пояснення переваги ефективності числового ідентифікатора. Але я думаю, що @George пробує глибше, ніж це. Технічно RDBMS не потребує, щоб їхні ідентифікатори були числовими, тож навіщо GIS?
whuber

1
Проблема тут не у виконанні. Незмінний унікальний ключ зробив би це. Але чому він повинен бути числовим? Як тільки я почув чи прочитав, що він повинен бути числовим, оскільки він використовує цей ключ для управління візуалізацією ... був у моделюванні нашого світу від ESRI?
Джордж Сільва

2
Оскільки ГІС не є RDBMS, хоча він може використовувати його. У ГІС зазвичай є деякі правила та припущення, наприклад, припущення, що первинним ключем буде індексоване ціле число чи GUID, задля виконання та надійності кодування.
blah238

1
добре, але навіщо вважати числовий? чому ми не можемо вибрати свій ключ під час створення шару?
Джордж Сільва

1
Я думаю, що головна причина полягає в тому, що ці припущення полегшують роботу над написанням коду, що значно покращує роботу пакета ГІС.
blah238

4

Якщо ви почнете додавати записи до шару, ви можете розраховувати на те, що користувач введе унікальний буквено-цифровий код для кожної нової функції безпосередньо перед записом на диск ..

..або ви могли реалізувати просте ціле поле для автоматичного збільшення.


4

Як багато людей припустили, це питання зручності; але, можливо, глибше, це конвенція.

Як програміст, моїм першим інстинктом було б використовувати цифровий ключ для ідентифікатора шару, тому що це було завжди. Дійсно, мені може навіть не прийти в голову, принаймні, на свідомому рівні, що я повинен це робити будь-яким іншим способом. Звичайно, якщо є технічна причина не використовувати цілі числа, скажіть, чи існує можливість наявності більше шарів, ніж можна зберегти в 32-бітних (дуже малоймовірна пропозиція!), Або якщо для цього є бізнес-причина, тоді альтернативи будуть розглядатися.

Існують також алгоритмічні міркування з цифровими клавішами. Сортування та пошук списку відсортованих значень зрештою зводиться до порівняння двох чисел, навіть якщо це список рядків або складних об'єктів; вони просто перетворюються на числа з функцією хешування . Зауваживши, що на сучасних комп’ютерах пошук списку 100 або навіть 1000 предметів, як правило, настільки ж швидкий при грубому підході, як і при високо оптимізованому алгоритмі. У випадку шарів в ГІС я не бачу навіть найскладніших карт, що мають більше 1000 або близько того, і навіть якби це було, інші пов'язані з ним обчислення займуть порядків більше, ніж будь-який невеликий приріст від оптимізованого пошук короткого списку.

Цілі клавіші "просто мають сенс" для програміста, і, як каже Бред, докладено більше зусиль у використанні нечислових ключів. Можливо, не більше коду, але більше розумових зусиль, і ми ліниві істоти за звичкою. Також ключ, що однозначно ідентифікує щось на кшталт шару в ГІС, вважається "прихованим" від користувача, щоб переконатися, що вони з ним не возиться і порушують код, який покладається на його унікальність (незважаючи на ключові слова DB UNIQUE). Тому що якщо ви дасте користувачеві достатньо мотузки, рано чи пізно хтось повіситься на нього. У будь-якому разі застосовувати унікальність у користувальницькому полі, але система, що лежить в основі, повинна вважати, що її ключ є унікальним і не має змоги.


OpenStreetMap є одним прикладом проекту , який потребує в більш , ніж 32-бітних цілих чисел. Вони використовують bigintдля своїх первинних ключів.
Майк Т

Для шляхів / вузлів, так. Але початкове питання стосувалося шарів у ГІС.
MerseyViking

OpenStreetMap зберігає шари GIS.
Джордж Сільва

OSM просто зберігає способи та вузли, у яких є теги ключ / значення. Саме система презентації (наприклад, OpenLayers) та сервер візуалізації (наприклад, Mapnik, Osmarender) визначають його поняття про шари на основі цих тегів чи чогось іншого. Але Майк правий, він використовує bigints для первинних ключів усіх своїх таблиць.
MerseyViking

+1 для згадки про конвенцію. Це умова, оскільки вона дорівнює кращій продуктивності.
CaptDragon

3

Це питання викликає заплутаність для людей (як я), які розробляють базу даних про геодані.

Це не обмеження для зберігання баз даних, оскільки PostgreSQL може визначати таблиці із складеними ОСНОВНИМИ КЛЮЧАми різних типів даних, однак ці таблиці не можна завантажувати в такі програми, як QGIS. У відповідній історичній примітці PostgreSQL використовував вимогу стовпця OID як внутрішнього ключа, який також був 32-бітним цілим числом. Це потрібно було до версії 7.2 .

32-розрядна цілочисельна вимога ID - це дійсно обмеження програмування. Набагато простіше мати індекс до набору записів як фіксованого типу даних (32-бітове ціле число), і для цього зручно також бути ПЕРВИЧНИЙ КЛЮЧ для цього запису. Складніше зробити так, щоб програма дозволяла складати первинний ключ, а також отримувати унікальний запис на основі декількох та / або різних типів даних. Однак, як і OID PostgreSQL, це обмеження можна подолати з часом розробки. Що стосується QGIS, [тепер] 5-річна помилка може бути вирішена якось днями (ось деякі останні дискусії з цієї теми).


+1 Добре сказано. В якості додаткового доказу, що це обмеження програмування, зауважте, що ESRI не вимагав (або використовував) жодних полів внутрішнього ідентифікатора в ArcView до виходу ArcGIS 8.x. Старий ArcView був здатний виконати всі операції з базою даних, які виконує ArcGIS (і насправді у багатьох з них було швидше).
whuber

2

В ESRI та іншому програмному забезпеченні GIS прийнято мати папку або набір файлів, які створюються в класах функцій або наборі даних.
наприклад, покриття arcinfo, форм-файл, база даних геоданих.
Ці "набори" файлів повинні бути "об'єднані" програмним забезпеченням для забезпечення багатьох функцій ГІС.
Напружують таблиці, мережу, топологічні елементи управління.
Це мета OID, а також причина для того, щоб зробити його нерегульованим, прихованим, керованим програмним забезпеченням.


Я думаю, що операції з ГІС можуть мати щось спільне з цим. перетинаються, (просторові) союзи, різниця тощо. Чи може хтось підтвердити чи представити це більш детально?
Джордж Сільва

Погляньте, як єдиний клас функцій SDE насправді зберігається в такій базі даних, як Oracle. Є одна таблиця для атрибутів, одна таблиця для геометрії, одна таблиця для просторового індексу, одна або кілька таблиць для індексів атрибутів і т. Д. Якщо ESRI повинен був підтримувати кожну кодову сторінку / кодування коду для рядка PKEY, ми б все ще залишається на ArcView 3.x.
blah238

@George - як зазначає blah238 Є дуже мало GIS-додатків, які використовують один єдиний файл для зберігання обох (усіх) даних. Які можуть складатися з координат, заходів, атрибутів, правил, відносин тощо, залежно від пакета. Це більше стосується того, щоб ми могли відслідковувати, який просторовий рядок йде з яким рядком атрибута, який мережевий рядок тощо.
Бред Несом

1
Вибачте blah238, я дійсно не думаю, що кількість коду була визначальною у цьому питанні. Обшивка не має нічого спільного з цим. База даних зробить "математику" і вирішить, чи є послідовність знаків однаковою чи ні, отже, застосовуючи PKEY. Це не на програмному рівні. @Brad Nesom: це теж має сенс. Але в Oracle і PostGIS ви можете зберігати всі свої атрибути в одній таблиці. Я погоджуюся, що shapefiles потребував жахливого ObjectID ... і це, можливо, встановило стандарт?
Джордж Сільва

@George Shapefiles не потрібні і, як правило, не використовували ObjectID. Це поле OID було введено з ArcGIS 8. Тому я сумніваюся, що shapefiles має щось спільне з цим питанням.
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.