Каков подходящий глобальный / универсальный уникальный идентификатор для базы данных PostGIS?

12

Я читал, что использование OID в качестве первичного ключа в базе данных postgreSQL / PostGIS является плохой практикой, поскольку существуют случаи, когда их можно сбросить. Звучит логично, но что тогда является подходящей альтернативой? Я полагаю, что есть возможность использовать UUID "универсального уникального идентификатора", но большое значение текста и чисел, которое выплевывается, ужасно.

Просто немного больше предыстории для моей ситуации. У меня есть все мои пространственные таблицы, созданные с полем «gid», которое является первичным ключом для этой таблицы и уникальным только для этой таблицы. У меня возникла проблема, потому что я хочу связать свои пространственные таблицы (все с полем «gid», начинающимся с 1 и с приращением) в одну большую таблицу со связанной информацией. Очевидно, что для того, чтобы мои отношения работали, все мои пространственные особенности нуждаются в уникальном идентификаторе, который отличает их друг от друга.

EDITED Добавил это изображение в соответствии с комментариями Петерса. Питер, эта идея у меня в голове, это может быть не самый лучший способ сделать это, или это может быть даже не хороший дизайн БД. Мне интересно, что вы думаете.

Концептуальная схема

Какие-нибудь советы?

Ando
источник
2
"Я прочитал" ... не могли бы вы предоставить ссылку?
Кирк Кайкендалл
1
Вот один из многих postgresql.org/docs/8.4/static/ddl-system-columns.html в нижней части страницы, в котором упоминается, что считается плохой практикой предполагать, что они уникальны. Также в этой следующей ссылке bytes.com/topic/postgresql/answers/423281-oid-not-oid в ответе на оригинальный пост упоминается, что OID не рекомендуется использовать для пользовательских таблиц.
Андо
1
Не могли бы вы добавить еще несколько конкретных деталей о том, какую схему вы пытаетесь создать. Мне не понятно, что вам обязательно нужен глобально уникальный идентификатор, если вы, например, немного измените отношения внешнего ключа.
Питер Айзентраут
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. Почему важно, как выглядит уникальный идентификатор?
nmtoken
«... но большой текст и числовое значение, которое выплевывает, ужасно». Нет, это не так. Это просто долго, как требуется для любого глобального уникального идентификационного номера .
jpmc26

Ответы:

5

Я хотел бы создать отдельные таблицы посредника buildings_attach, parcels_attachи т.д. Тогда вам не нужен глобальный идентификатор.

Питер Айзентраут
источник
Привет Питер, спасибо за ответ. Наконец мне удалось связаться с нашим администратором баз данных (она находится в другом офисе), она предложила то же решение, что и вы. Я счастлив пойти по этому пути, поскольку я определенно не являюсь сотрудником БД (это может быть очевидно из моего чертежа схемы?!?), Но действительно ли это лучшее решение? Что произойдет, если было вложение, относящееся как к элементу Parcel, так и к элементу здания? На приведенной выше схеме мне нужно будет только один раз ввести данные для вложения, тогда как в качестве решения, предложенного администратором базы данных, мне нужно будет сделать это дважды в двух разных таблицах.
Андо
1
Да, но это две отдельные части информации, поэтому можно вводить их в двух разных местах. Это просто способ разработки реляционной базы данных.
Питер Айзентраут
Спасибо за помощь, Питер, я ценю разъяснения! Я пойду по этому маршруту. Приветствия
Андо
9

Два решения:

1) Создайте одну последовательность и сделайте так, чтобы все таблицы использовали эту последовательность, это можно сделать с самого начала, или вы можете создать столбец идентификаторов и обновить свои таблицы сейчас.

Чтобы создать последовательность:

CREATE SEQUENCE universal_sequence;

Тогда стол:

CREATE TABLE (
colname integer NOT NULL DEFAULT nextval('universal_sequence'));

Чтобы обновить поле идентификатора существующей таблицы новыми идентификаторами (сделайте это для всех таблиц, для которых вы хотите следовать той же последовательности):

UPDATE table1
SET id=nextval('universal_sequence'));

2) Другое решение: создайте временную последовательность и выполните запрос, создав новый столбец идентификатора.

Подробнее здесь: http://www.postgresql.org/docs/8.4/static/sql-createsequence.html

Pablo
источник
4

Наилучшим вариантом является UUID или GUID. По этой причине они построены по всему миру, независимо от того, за каким столом. Гадкий? Да, но они являются лучшими в этой ситуации.

См. Https://stackoverflow.com/questions/294933/generate-unique-id-to-share-with-multiple-tables-sql-2008.

Я видел методы, в которых люди используют данные из таблицы для создания идентификаторов, например, col1 + somestring + col2, я бы действительно против этого (см. Здесь ). Интеллектуальные идентификаторы - действительно плохая идея.

Натан У
источник
0

алло

Почему бы вам не взять идентификатор из большой таблицы и вместо этого поместить в пространственные таблицы?

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

/ Никлас

Никлас Авен
источник
Привет Никлас, я не могу сделать это таким образом, потому что одна из моих пространственных особенностей может относиться к 1 или более записям в большой таблице
Ando