没有主键的数据库表

时间:2012-02-24 17:05:50

标签: database database-design

我知道数据库在表中存储数据的顺序是随机的 - 前提是没有主键。我的问题是,从根本上说,在查询后数据更改顺序时会发生什么?如果一个人打开了一个数据库,关闭它并再次打开它以查找不同顺序的数据,当发生这种情况时会发生什么?

6 个答案:

答案 0 :(得分:3)

我认为你混淆了许多相关的概念。

主键是一个概念性的东西。它是关系数据库中记录的唯一标识符。

主键通常通过唯一索引实现。在某些数据库系统上,您可以将这些指定为“clustered”;这些会影响磁盘上数据的物理排序。

返回数据的顺序首先由“order by”子句控制;如果它不可用,则没有定义 - 每个数据库都可以自由地实现它。

实际上,这意味着“按照它存储在磁盘上的顺序”;如果有聚集索引,它将按此顺序;如果没有,它可以是查询缓存中的任何内容,也可以是记录存储在磁盘上的顺序。

答案 1 :(得分:3)

  

我知道数据库在表中存储数据的顺序是随机的 - 前提是没有主键。

实际上,这个假设是无效的。声明主键不需要数据库按磁盘中的某种特定顺序布置数据。它唯一要做的就是要求数据库保证没有重复键的行

现在,数据库如何保证?简短的回答以任何方式选择;只要它有效,数据库实现者就可以自由选择任何东西。最常见的机制创建了一个独特的索引,并使用它来保证唯一性;索引是有序的,但表不是。

但是RDBMS经常提供替代策略来做同样的事情;例如,索引组织表(Oracle中可用的可选功能)遵循保持表本身有序的策略。与默认策略相比,这有一些优点和缺点(为某些类型的查询提供更好的性能,但使用更多的磁盘空间)。

毕竟,这是数据库系统的重点:您可以用高级术语(表,键,约束)定义数据模式,RDBMS决定如何组织数据。我们为RDBMS如何选择这样做提供了很大的自由,因为我们希望设计和实现数据库系统的聪明人能够发明更新,更好的方法来做同样的事情。

  

我的问题是,从根本上说,在查询后数据更改顺序时会发生什么?如果一个人打开了一个数据库,关闭它并再次打开它以查找不同顺序的数据,当发生这种情况时会发生什么?

首先,除非您告诉数据库您希望查询结果按照特定顺序(使用ORDER BY),否则允许以任何顺序返回结果。

最常见的原因:数据库选择了不同的执行计划,这些计划在同一个表上使用不同的索引。不同的索引具有不同的顺序,因此不同的索引选择会导致不同的结果顺序。

然而,还有其他原因。例如,某些数据库可能并行执行查询的不同部分,在这种情况下,不预先确定哪些行可用。关键的一点是,没有必须生成行的预定义顺序这一事实允许数据库实现者根据他们认为最快的内容选择替代策略。

答案 2 :(得分:2)

如果您没有使用ORDER BY订购,数据库基本上可以按照最方便的顺序返回内容。

可以订购的方式的一些例子;

  • 在插入行的顺序中返回结果。这很可能每次都以相同的顺序返回行。
  • 按照它们在索引中显示的顺序返回结果。由于某些数据库可以随时重建索引,因此事情可能并不总是以相同的顺序显示,尤其是在INSERT / UPDATE / DELETE之后。
  • 首先返回缓存的结果,返回必须在磁盘显示时从磁盘读取的结果。这将使查询的第一个结果快速显示,但每次执行查询时,结果将以完全不可预测的顺序显示。

换句话说,除非您明确要求,否则不要相信订单,数据库可能会为您的利益优化一些事情而让您感到惊讶。

另请注意,这基本上与primary key无关,除非您对其进行ORDER BY,否则它对排序没有影响。它只是一种方便且不变的方式来引用另一个表的结果。

答案 3 :(得分:2)

“但是有一天有人问我为什么数据会改变顺序而且我不知道。”

原因是没有“固有”排序是关系模型最基本的属性之一。集合{1 2}与集合{2 1}是完全相同的集合,关系模型起源于集合论。

答案 4 :(得分:1)

您可以实现编程密钥 - 通过编程逻辑管理数据; neverthelss这不是一个好习惯。 此外,DBMS无法正确管理没有主键的数据 - 数据一致性可能(并且将会)受到损害

答案 5 :(得分:1)

它可能是关于实现的问题 - 所以它取决于你正在使用的DBMS。

最简单的答案 - 来自此表的数据不在DBMS缓存中,如果没有使用显式ORDER BY运算符指定,将以任意顺序从磁盘读取。

不存在的主键的主要问题 - 数据一致性的丧失。表不具有主键的唯一原因 - 当表是分段(缓冲)表时。