Database design 在表中存储指向另一个表中的行的指针,而不是使用外键
我只是好奇,是否可以只使用c/java/等方式的指针,而不是基于外键连接表。既然我们在讨论这个话题,postgres或任何其他RDBMS在连接时是否使用指针来快速定位外键引用的行,而不是在包含FKs的整个表中搜索?数据关系模型的一个基本特征是它不使用指针,数据库外部逻辑视图中的结构链接或基于地址的数据访问。废除指针的使用实际上是Codd在1969年发明关系模型的主要动机之一Database design 在表中存储指向另一个表中的行的指针,而不是使用外键,database-design,pointers,reference,rdbms,object-oriented-database,Database Design,Pointers,Reference,Rdbms,Object Oriented Database,我只是好奇,是否可以只使用c/java/等方式的指针,而不是基于外键连接表。既然我们在讨论这个话题,postgres或任何其他RDBMS在连接时是否使用指针来快速定位外键引用的行,而不是在包含FKs的整个表中搜索?数据关系模型的一个基本特征是它不使用指针,数据库外部逻辑视图中的结构链接或基于地址的数据访问。废除指针的使用实际上是Codd在1969年发明关系模型的主要动机之一 指针当然是大多数基于关系/SQL的DBMS内部使用的。Oracle有一种称为ROWID的东西,它将一行的物理地址存储在表中
指针当然是大多数基于关系/SQL的DBMS内部使用的。Oracle有一种称为ROWID的东西,它将一行的物理地址存储在表中。它们看起来像
AAAA8mAALAAAAQkAAA
,可以细分为:
- 数据对象编号(段)
[AAAA8m]
- 表空间中的数据文件
[AAL]
- 数据块(在数据文件中)
[AAAAQk]
- 行(在块内)
[AAA]
总之:与常规索引访问相比,基于rowid的访问没有提供足够的好处,不值得冒不可避免的失败风险。知道它们的存在和它们是什么,但永远不要依赖它们。我经常想知道这一点。RDBMS可以将物理行指针(如PostgreSQL ctid)与外键列中的值一起秘密存储,然后可以使用它查找引用的行,而无需通过索引。但是,每当引用的表被压缩时,它都需要更新。而且,行会更大,因此IO带宽和缓存会更紧张。是否会有净绩效收益?它能证明增加的复杂性吗?但它们是以这种特殊的方式使用的吗?是否有数据库存储指向磁盘上引用行的指针?