主键列的外键约束 - 问题?

zzz*_*eek 3 sql sql-server postgresql

从性能/索引/数据管理的角度来看,使用子项上的主键作为外键与子项上的纯代理主键创建表之间的一对一关系有哪些优缺点?第一种方法似乎是减少冗余并且很好地隐式地约束一对一,而第二种方法似乎受到DBA的青睐,即使它创建了第二个索引:

create table parent (
     id integer primary key, 
     data varchar(50)
)

create table child (
     id integer primary key references parent(id), 
     data varchar(50)
)
Run Code Online (Sandbox Code Playgroud)

纯替代钥匙:

create table parent (
     id integer primary key, 
     data varchar(50)
)

create table child (
     id integer primary key,
     parent_id integer unique references parent(id), 
     data varchar(50)
)
Run Code Online (Sandbox Code Playgroud)

这里感兴趣的平台是Postgresql,Microsoft SQL Server.

编辑:

所以这是来自实际DBA的基本思想.主要关注的是子表上的索引碎片.假设主键为1-1000000的记录插入到父表中,子表中没有任何内容.稍后,临时操作开始使用与父表中的行相对应的行(但是以随机顺序)填充子表.令人担忧的是,这将导致插入页面拆分,导致索引碎片,并导致删除"瑞士奶酪"效果.我承认这些不是我非常熟悉的术语,当谷歌搜索它们时,点击似乎与Microsoft SQL服务器相关.这些特定于MS的问题(即,PG的分析是否可以缓解PG上的问题)?如果是这样,那么这是使用像Postgresql这样的数据库的另一个原因.

Eri*_*lje 5

如果这是一个严格的1-1关系,我认为没有理由不使用第一个选项.

第二个选项提供了一些灵活性,以便稍后使其成为1-many关系,这可能是DBA可能支持该选项的原因.