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这样的数据库的另一个原因.