对于PostGIS数据库,什么是合适的全局/通用唯一标识符?


12

我已经读到,在Ogres作为PostgreSQL / PostGIS数据库中的主键是不好的做法,因为在某些情况下可以重置OID。听起来合乎逻辑,但是什么是合适的选择?我相信可以使用“ Universal Unique Identifer” UUID,但是随即出现的大文本和数字值太可怕了。

我的情况仅需更多背景知识。我用一个名为“ gid”的字段创建了所有空间表,这是该表的主键,并且仅对该表唯一。我现在遇到一个问题,因为我想将我的空间表(所有以“ gid”字段从1开始并递增)关联到一个包含相关信息的大表。显然,要使我的关系正常工作,我所有的空间特征都需要一个唯一的标识符,以将它们彼此区分开。

编辑根据彼得斯的评论添加了这张图片。彼得,这就是我的想法,这可能不是解决问题的最佳方法,甚至可能不是好的数据库设计。我对您的想法感兴趣。

概念图

有小费吗?


2
“我已阅读” ...您能提供一个链接吗?
柯克·库肯达尔

1
这是指向页面底部的许多postgresql.org/docs/8.4/static/ddl-system-columns.html之一,它提到假定它们是唯一的做法是不好的做法。同样,下一个链接bytes.com/topic/postgresql/answers/423281-oid-not-oid对原始帖子的回复提到,用户表不建议使用OID。
安藤

1
您能否添加一些关于您要创建哪种模式的具体细节。我不清楚,例如,如果稍微更改外键关系,则不一定需要全局唯一的ID。
Peter Eisentraut 2011年

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

Answers:


5

我将创建单独的中介表buildings_attachparcels_attach等等。然后,您不需要全局标识符。


嗨,彼得,谢谢您的回复。我终于设法与我们的DBA(她在另一个办公室工作)取得联系,她提出了与您相同的解决方案。我很高兴走这条路,因为我绝对不是DB的人(从我的架构图中可以很明显看出来吗?!?),但这真的是最好的解决方案吗?如果存在与宗地要素和建筑要素都相关的附件,会发生什么情况?在上面的图表中,我只需要输入附件的详细信息一次,在DBA建议的解决方案中,我需要在两个不同的表中输入两次。
安藤

1
是的,但是它们是两条单独的信息,因此可以在两个地方输入它们。这就是关系数据库设计的工作方式。
Peter Eisentraut 2011年

感谢彼得的帮助,感谢您的澄清!我会走那条路线。干杯
安藤

9

两种解决方案:

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



0

哈罗

为什么不从大表中获取ID并放入空间表中呢?

如果空间表之一中的一行与大表中的多行相关,我会看到问题,否则大表ID应该足够,否则我会丢失一些东西。

/尼克斯


嗨,尼克拉斯,我不能那样做,因为我的空间特征之一可能与较大表中的1条或多条记录有关
Ando
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.