ほとんどのGISパッケージに数値IDが必要なのはなぜですか?


11

これは簡単ですが、物議を醸す可能性のある質問です。なぜ(すべてではないにしても)ほとんどのGISパッケージで、決定されたレイヤーにNULL不可の一意の数値識別子が必要なのはなぜですか?

自然なキーではなく、このような代理キーが必要なのはなぜですか?

例:

  • ArcGISはOBJECTID(またはGlobalID)を実施します

  • QGISは、数値IDを持たないレイヤーをロードしません。


8
考えられる説明:数値IDは、非数値IDよりもはるかに少ないバイトを使用します。これは、IDのコピーをすべて格納するさまざまなテーブルのリンクを開始するときにさらに重要になります。
johanvdw

+1良い質問です。NoSQLには数字キーが必要だとは思いません。
カーククイケンドール


@capこれは少し気味の悪いことです(既にそのリンクを投稿しています)。
whuber

回答:


6

最適化されたインデックス可能なフィールドが必要だからです。文字列フィールドに何度もインデックスを作成するには、より多くのオーバーヘッドが必要になり、最終的にはそれほど効率的ではありません。

ESRIは、SDEの世界でGUIDフィールドである「GLOBALID」を実際にサポートしているため、これは32文字のフィールドですが、パフォーマンスを向上させるためにインデックスが付けられています。


3
これは、数値IDの効率の利点を説明するのに適しています。しかし、@ Georgeはこれよりも深く調査していると思います。技術的には、RDBMSの識別子は数値である必要はありませんが、なぜGISが必要なのでしょうか?
whuber

1
ここでの問題はパフォーマンスではありません。nullを許可しない一意キーがそれを行います。しかし、なぜ数値でなければならないのでしょうか?レンダリングを制御するためにそのキーを使用するため、数値である必要があることを聞いたり読んだりしたら... ESRIからModeling Our Worldにありましたか?
ジョージシルバ

2
GISはRDBMSではないため、RDBMSを使用できます。GISには、通常、パフォーマンスとコーディングの健全性のために、主キーがインデックス付き整数またはGUIDであるという仮定など、いくつかのルールと仮定があります。
blah238

1
わかりましたが、なぜ数値を仮定するのですか?レイヤーを作成するときにキーを選択できないのはなぜですか?
ジョージシルバ

1
主な理由は、これらの仮定がGISパッケージをはるかに簡単に機能させるコードを書く仕事をするからだと思います。
blah238

4

レイヤーへのレコードの追加を開始する場合、ユーザーがディスクに書き込む直前に新しい機能ごとに一意の英数字コードを入力することに頼ることができます。

..または、単純な自動インクリメント整数フィールドを実装できます。


4

多くの人が示唆しているように、それは利便性の問題です。しかし、おそらくもっと深く、それは慣習です。

プログラマーとしての最初の本能は、レイヤーIDに数値キーを使用することです。なぜなら、それが常に行われている方法だからです。確かに、少なくとも意識レベルでは、他の方法でそれを行う必要があることさえ、私には思いつかないかもしれません。もちろん、整数を使用しない技術的な理由がある場合、たとえば32ビットに格納できるよりも多くのレイヤーが存在する可能性がある場合(非常にありそうもない命題!)、またはビジネス上の理由がある場合は、その後、代替案が検討されます。

数値キーに関するアルゴリズム上の考慮事項もあります。並べ替え、および並べ替えられた値のリストの検索は、文字列や複雑なオブジェクトのリストであっても、最終的には2つの数値の比較になります。それらはハッシュ関数で単に数字に変わるだけです。とはいえ、現代のコンピューターでは、たとえば100個または1000個ものアイテムのリストを検索することは、高度に最適化されたアルゴリズムを使用する場合と同じくらい、ブルートフォースアプローチを使用するのが普通です。GISのレイヤーの場合、1000以上の複雑なマップでさえ見ることができず、たとえそうだとしても、他の関連する計算は、最適化による小さなゲインよりも桁違いに長くかかります短いリストの検索。

整数キーはプログラマーにとって「理にかなっている」だけであり、Bradが言うように、非数値キーの使用にはさらに努力が必要です。コードを増やすのではなく、精神的な努力を重ねるのかもしれません。私たちは習慣の怠け者です。また、GISのレイヤーのようなものを一意に識別するキーは、ユーザーから「隠されている」と見なされ、ユーザーが混乱しないようにし、一意性に依存するコードを破壊します(DB UNIQUEキーワードにもかかわらず)。ユーザーに十分なロープを与えると、遅かれ早かれ誰かがそれでハングアップするからです。ユーザーが編集可能なフィールドに必ず一意性を強制しますが、基になるシステムはそのキーが一意であり、改ざんされていないことを前提とする必要があります。


OpenStreetMapは以上の32ビット整数を必要とするプロジェクトの一例です。bigint主キーに使用します。
マイクT

ウェイ/ノードについては、はい。しかし、元の質問はGISのレイヤーに関するものでした。
MerseyViking

OpenStreetMapはGISレイヤーを保存します。
ジョージシルバ

OSMは、キー/値タグを持つウェイとノードを保存するだけです。これらのタグなどに基づいてレイヤーの概念を決定するのは、プレゼンテーションシステム(OpenLayersなど)とレンダリングバックエンド(Mapnik、Osmarenderなど)に任されています。しかし、マイクは正しいbigintです。すべてのテーブルの主キーにsを使用しています。
MerseyViking

慣習について言及している+1。これは、パフォーマンスの向上に匹敵するため、慣例です。
CaptDragon

3

この質問は、ジオデータベース側の物事を開発する人(私のような人)にとって紛らわしい質問です。

PostgreSQLは異なるデータ型の複合プライマリキーを持つテーブルを定義できるため、データベースストレージの制限ではありませんが、これらのテーブルはQGISなどのプログラムにロードできません。関連する歴史的なメモでは、PostgreSQLは、OID列を内部キーとして要求していましたが、これも32ビット整数でした。これは、バージョン7.2まで必要でした

32ビット整数IDの要件は、実際にはプログラミングの制限です。一連のレコードへのインデックスを固定データ型(32ビット整数)として持つ方がはるかに簡単であり、これがそのレコードのプライマリキーでもあると便利です。プログラムで複合主キーを許可し、複数またはさまざまなデータ型に基づいて一意のレコードを取得することは、より困難です。ただし、PostgreSQLのOIDと同様に、この制限は開発時間で克服できます。QGISの場合、[現在] 5年前のバグはいつか解決されるかもしれません(このトピックに関する最近の議論があります)。


+1そうですね。これがプログラミングの制限であることのさらなる証拠として、ESRIはArcGIS 8.xが登場する前にArcViewの内部識別子フィールドを必要としない(または使用しない)ことに注意してください。古いArcViewは、ArcGISが実行するすべてのデータベース操作に対応していました(実際、それらの多くで高速でした)。
whuber

2

ESRIおよびその他のGISソフトウェアでは、フィーチャクラスまたはデータセットを作成するフォルダーまたはファイルのセットが一般的です。
例:arcinfoカバレッジ、シェープファイル、ファイルジオデータベース。
これらのファイルの「セット」は、多くのGIS機能を可能にするために、ソフトウェアによって「結合」される必要があります。
Attrubuteテーブル、ネットワーク、トポロジコントロール。
それがOIDの目的であり、それをNull不可、非表示、ソフトウェア制御にする理由でもあります。


GISの運用は、これと何か関係があるのではないでしょうか。交差、(空間)組合、差異など。これをより詳細に確認したり提示したりできますか?
ジョージシルバ

単一のSDEフィーチャクラスが実際にOracleなどのデータベースにどのように保存されているかを見てください。属性用のテーブル、ジオメトリ用のテーブル、空間インデックス用のテーブル、属性インデックス用のテーブルなどがあります。ESRIが文字列PKEYのすべてのコードページ/文字エンコーディングをサポートする必要がある場合すべてがArcView 3.x上にあります。
blah238

@George-blah238で述べたように、1つのファイルを使用して両方(すべて)のデータを保存するGISアプリケーションはほとんどありません。パッケージに応じて、座標、メジャー、属性、ルール、関係などで構成できます。それは、どの空間行がどの属性行、どのネットワーク行などに対応しているかを追跡できることと関係があります。
ブラッドネソム

1
ごめんなさいblah238、私は本当にこの問題でコードの量が決定的であるとは思わない。エンコーディングはこれとは関係ありません。データベースは「数学」を実行し、文字のシーケンスが等しいかどうかを判断するため、PKEYを強制します。ソフトウェア層ではありません。@Brad Nesom:それも理にかなっています。ただし、OracleおよびPostGISでは、すべての属性を1つのテーブルに保存できます。シェープファイルには恐ろしいObjectIDが必要だったことに同意します。
ジョージシルバ

@George ShapefilesはObjectIDを必要とせず、一般的なルールとして使用しませんでした。そのOIDフィールドはArcGIS 8で導入されました。したがって、シェイプファイルが質問に関係しているとは思いません。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.