【发布时间】:2010-06-04 05:39:38
【问题描述】:
从性能/索引/数据管理的角度来看,使用子级上的主键作为外键创建表之间的一对一关系与子级上的纯代理主键相比有哪些优点/缺点?第一种方法似乎减少了冗余并很好地隐式约束了一对一,而第二种方法似乎受到 DBA 的青睐,即使它创建了第二个索引:
create table parent (
id integer primary key,
data varchar(50)
)
create table child (
id integer primary key references parent(id),
data varchar(50)
)
纯代理键:
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)
)
这里感兴趣的平台是 Postgresql、Microsoft SQL Server。
编辑:
以下是来自实际 DBA 的基本想法。主要关注的是子表上的索引碎片。假设将主键为 1-1000000 的记录插入到父表中,而子表中没有任何内容。稍后,临时操作开始使用与父表中的行相对应的行填充子表,但顺序是随机的。令人担忧的是,这会导致插入时出现页面拆分,导致索引碎片,并导致删除时出现“瑞士奶酪”效应。我承认这些不是我非常熟悉的术语,在谷歌上搜索它们时,这些点击似乎都与 Microsoft SQL Server 相关。这些是特定于 MS 的问题吗(即 PG 的 ANALYZE 等是否缓解了 PG 上的问题)?如果是这样,那么这就是使用像 Postgresql 这样的数据库的另一个原因。
【问题讨论】:
标签: sql sql-server postgresql