Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 使用以表标识号为后缀的ID的缺点是什么?_Postgresql_Database Design_Primary Key_Surrogate Key - Fatal编程技术网

Postgresql 使用以表标识号为后缀的ID的缺点是什么?

Postgresql 使用以表标识号为后缀的ID的缺点是什么?,postgresql,database-design,primary-key,surrogate-key,Postgresql,Database Design,Primary Key,Surrogate Key,我在玩: DROP TABLE users CASCADE; CREATE SEQUENCE users_id_seq MINVALUE 100; CREATE TABLE users ( id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('users_id_seq') * 100 + 1, ... ); ALTER SEQUENCE users_id_seq OWNED BY users.id; DROP TABLE txns C

我在玩:

DROP TABLE users CASCADE;
CREATE SEQUENCE users_id_seq MINVALUE 100;
CREATE TABLE users (
    id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('users_id_seq') * 100 + 1,
    ...
);
ALTER SEQUENCE users_id_seq OWNED BY users.id;

DROP TABLE txns CASCADE;
CREATE SEQUENCE txns_seq MINVALUE 100;
CREATE TABLE txns (
    id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('txns_seq') * 100 + 2,
    ...
);
ALTER SEQUENCE txns_seq OWNED BY txns.id;
...
在我看来,这有以下好处:

  • 每个id在整个数据库中都是唯一的,可以消除错误的表错误
  • 没有一个id的值小于10000,消除了与大多数迭代计数器的混淆
  • 包含表很容易从任何id的最后两位数字中学习
缺点:

  • 我们浪费了99%的身份证

还有什么缺点我没有考虑过呢?

正如有人评论的那样,有很好的理由不去那里。通常,代理PK是其表中的行的唯一标识符,不包含其他信息

我还没有“错误的表错误”或“与迭代计数器混淆”的案例。将整数(
int4
)PK的键空间减少99%以后可能会对您产生不利影响,同时将您自己的表限制在最多100个。如果您开始依赖数字的含义(我建议您不要这样做),那么最好确保新表遵守规则。没有人插入手动ID值或更改ID值

也就是说,如果你去那里,考虑:

创建序列用户\u id\u seq最小值1增量100;——①
创建表用户(
users_id bigint主键默认值nextval('users_id_seq'),--②
...
);
更改users.id拥有的序列users\u id\u seq;
创建序列txns_id_seq MINVALUE 2增量100;
创建表txns(
txns_id bigint主键默认值nextval('txns_id_seq'),
...
);
更改txns.id拥有的序列txns_id_seq;
① 使用,
MINVALUE 2增量100
等代替手动计算

② 使用
bigint
来弥补减少的密钥空间。
另外,奇怪的是,您花了这么多精力在整个数据库中创建唯一的id,然后使用非描述性、重复的列名,如
id
txns\u id
是一种更好的命名约定

缺点:更容易受到
setval()
ALTER SEQUENCE
的破坏。
撤销所有普通用户对序列的
UPDATE
权限。

正如已经评论的那样,有很好的理由不去那里。通常,代理PK是其表中的行的唯一标识符,不包含其他信息

我还没有“错误的表错误”或“与迭代计数器混淆”的案例。将整数(
int4
)PK的键空间减少99%以后可能会对您产生不利影响,同时将您自己的表限制在最多100个。如果您开始依赖数字的含义(我建议您不要这样做),那么最好确保新表遵守规则。没有人插入手动ID值或更改ID值

也就是说,如果你去那里,考虑:

创建序列用户\u id\u seq最小值1增量100;——①
创建表用户(
users_id bigint主键默认值nextval('users_id_seq'),--②
...
);
更改users.id拥有的序列users\u id\u seq;
创建序列txns_id_seq MINVALUE 2增量100;
创建表txns(
txns_id bigint主键默认值nextval('txns_id_seq'),
...
);
更改txns.id拥有的序列txns_id_seq;
① 使用,
MINVALUE 2增量100
等代替手动计算

② 使用
bigint
来弥补减少的密钥空间。
另外,奇怪的是,您花了这么多精力在整个数据库中创建唯一的id,然后使用非描述性、重复的列名,如
id
txns\u id
是一种更好的命名约定

缺点:更容易受到
setval()
ALTER SEQUENCE
的破坏。
撤销所有普通用户对序列的
UPDATE
特权。

您认为的“好处”都不是真正的好处。尤其是“表格是从ID中学习的”这一说法相当有争议。主键(尤其是生成的主键)不应携带任何“元信息”。生成的主键的唯一任务是该表的唯一性。“消除困惑”这一部分对我来说似乎极为可疑。这种“混乱”会在哪里出现?当我调试我的程序时?对我来说毫无意义。@a_horse_和_no_名字我有处理一些恐怖事件的经验(不是我造成的)。帮助调试和深入防御错误是第二天性。也许,具有强制外键正确性的Postgres可能不需要在处理许多外键甚至没有被指定为外键的古老MySQL数据库时看似合理的措施。id只是单个数据库中单个记录的唯一标识符。其他表中的其他记录可能引用此is id,但仅此而已。非常简单和直接,在过去几十年中在任何数据库中都能完美地工作。你为什么要把事情弄得更复杂?它只能失败。你认为的“好处”都不是真正的好处。尤其是“表格是从ID中学习的”这一说法相当有争议。主键(尤其是生成的主键)不应携带任何“元信息”。生成的主键的唯一任务是该表的唯一性。“消除困惑”这一部分对我来说似乎极为可疑。这种“混乱”会在哪里出现?当我调试我的程序时?对我来说毫无意义。@a_horse_和_no_名字我有处理一些恐怖事件的经验(不是我造成的)。帮助调试和深入防御错误是第二天性。也许,具有强制外键正确性的Postgres可能不需要在处理许多外键甚至没有被指定为外键的古老MySQL数据库时看似合理的措施。id只是单个数据库中单个记录的唯一标识符。其他表中的其他记录可能引用