我只是好奇是否可以只使用 c/java/etc 的指针。方式而不是基于外键连接表。既然我们在这个话题上,postgres 或任何其他 RDBMS 在加入时是否使用指针来快速定位由外键引用的行,而不是在包含 FK 的整个表中搜索?
2 回答
数据关系模型的一个基本特征是它在数据库的外部逻辑视图中不使用指针、结构链接或基于地址的数据访问。事实上,废除指针的使用是 Codd 在 1969 年发明关系模型的主要动机之一。
当然,大多数基于关系/SQL 的 DBMS 在内部使用指针。
Oracle 有一个叫做 ROWID 的东西,它在表中存储一行的物理地址。它们看起来像AAAA8mAALAAAAQkAAA
可以分解为:
- 数据对象 nr(段)
[AAAA8m]
- 表空间中的数据文件
[AAL]
- 数据块(数据文件内)
[AAAAQk]
- 行(块内)
[AAA]
使用 rowid 是在单个块读取中物理定位任何行的最快方法。它们在内部使用,但可以由开发人员直接使用。通过主键查找一行,导致一个(或几个)索引读取以找到 rowid,然后数据库将定位块并提取该行。如果知道 rowid,则不需要索引查找。
话虽如此,关系数据库的支柱之一是模型应该独立于物理存储(没有指针)。此外,它还使特定实现(dbms)能够透明地优化和提供附加功能。
每次使用 rowid 时,独角兽都会死去,便便从天上掉下来。例如,如果你收缩一个表,或者更新一个分区表(导致一行移动到另一个分区),或者如果你正在重建一个表,或者导出/导入一个表,或者......或者......或者...... .rowid 会改变。
总之:基于 rowid 的访问并没有提供比常规索引访问足够的好处,值得冒不可避免的失败的风险。知道它们的存在和它们是什么,但永远不要依赖它们。