PostGISデータベースに適したグローバル/ユニバーサル一意識別子とは何ですか?


12

OIDをpostgreSQL / PostGIS dbの主キーとして使用することは、これらをリセットできるインスタンスがあるため、お粗末な慣習であると読みました。論理的に聞こえますが、適切な代替手段は何ですか?「Universal Unique Identifer」UUIDを使用するオプションがあると思いますが、吐き出される大きなテキストと数値は恐ろしいです。

私の状況のもう少し背景。「gid」というフィールドで作成されたすべての空間テーブルがあります。これは、そのテーブルの主キーであり、そのテーブルにのみ一意です。空間テーブル(1から始まり増分する「gid」フィールドを持つすべて)を関連情報を持つ1つの大きなテーブルに関連付けるため、問題が発生しました。私の関係が機能するためには、明らかに私のすべての空間的特徴には、それらを互いに区別する一意の識別子が必要です。

編集ピーターズのコメントに従ってこの画像を追加しました。ピーターこれは私が私の頭の中に持っているアイデアです、それについて行くための最良の方法ではないかもしれません、またはそれは良いDBデザインでさえないかもしれません。あなたの考えに興味があります。

概念図

任意のヒント?


2
「読みました」...リンクを提供してもらえますか?
カーククイケンドール

1
これは、ページの下部にある多くのpostgresql.org/docs/8.4/static/ddl-system-columns.htmlの 1つです。一意であると想定するのは悪い習慣であると述べています。また、次のリンクbytes.com/topic/postgresql/answers/423281-oid-not-oidの元の投稿への返信には、OIDがユーザーテーブルで廃止されることが記載されています。
安藤

1
作成しようとしているスキーマの種類について、さらに具体的な詳細を追加してください。たとえば、外部キーの関係を少し変更する場合、グローバルに一意のIDが必要になることは私には明らかではありません。
ピーターアイゼントラウト

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_attachparcels_attachなどを作成します。その後、グローバル識別子は必要ありません。


こんにちはピーター、応答をありがとう。私はついにDBA(彼女は別のオフィスを拠点としている)と連絡を取ることができました。彼女はあなたと同じ解決策を提案しました。私は間違いなくDB担当者ではないので、このルートを利用できてうれしいです(スキーマの描画から明らかなのでしょうか?!?)が、それが本当に最良のソリューションですか?区画機能と建物機能の両方に関連する添付ファイルがあった場合はどうなりますか?上記の図では、添付ファイルの詳細を1回入力するだけで済みますが、DBAが提案したように、2つの異なるテーブルで2回実行する必要があります。
安藤

1
はい。ただし、2つの別々の情報なので、2つの別々の場所に入力しても構いません。これは、リレーショナルデータベースの設計がうまくいく方法です。
ピーターアイゼントラウト

ピーターに助けてくれてありがとう、明確に感謝します!そのルートを下って行きます。乾杯
安藤

9

2つのソリューション:

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など、IDを作成するためにテーブルのデータを使用する方法を見てきましたが、実際にはこれに反対します(こちらを参照)。インテリジェントIDは本当に悪い考えです。


0

ハロー

大きなテーブルからidを取得して、代わりに空間テーブルに入れてみませんか?

空間テーブルの1つの行が大きなテーブルの複数の行に関連している場合、問題が発生します。そうでない場合は、大きなテーブルIDで十分であるか、何か不足しています。

/ Nicklas


私の空間的な特徴の一つは、大きなテーブルに1つのまたは複数のレコードに関連することができるのでこんにちはニクラス、私は道というそれを行うことはできません
安藤
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.