Oracle 为什么没有主键

Oracle 为什么没有主键,oracle,database-design,mysql,Oracle,Database Design,Mysql,我继承了一个数据库,其中的表缺少主键。这是一个OLTP数据库。其中一个表有大约300k条记录,并且没有实现主键,即使检查架构的其余部分告诉我一列用作主键,即复制到另一个表中,具有相同的名称等。即,这不是一个“行结束”表 此数据库也不实现FKs 我的问题是-表(在Oracle中)没有主键有什么正当的理由吗?我不是数据库专家,但我记得我和一位在Oracle应用部门工作的朋友进行了一次对话,他告诉我这样做是为了处理紧急情况。如果生成的某个报告中存在问题,您可以通过将其放入行来解决,那么db级别的约束通

我继承了一个数据库,其中的表缺少主键。这是一个OLTP数据库。其中一个表有大约300k条记录,并且没有实现主键,即使检查架构的其余部分告诉我一列用作主键,即复制到另一个表中,具有相同的名称等。即,这不是一个“行结束”表

此数据库也不实现FKs


我的问题是-表(在Oracle中)没有主键有什么正当的理由吗?

我不是数据库专家,但我记得我和一位在Oracle应用部门工作的朋友进行了一次对话,他告诉我这样做是为了处理紧急情况。如果生成的某个报告中存在问题,您可以通过将其放入行来解决,那么db级别的约束通常会妨碍您。它们通常在应用程序而不是数据库中实现诸如唯一主键之类的功能。虽然效率很低,但对他们来说已经足够了,而且在灾难恢复场景中更易于管理。

我不是数据库专家,但我记得我与一位在Oracle应用部门工作的朋友进行了一次对话,他告诉我这样做是为了处理紧急情况。如果生成的某个报告中存在问题,您可以通过将其放入行来解决,那么db级别的约束通常会妨碍您。它们通常在应用程序而不是数据库中实现诸如唯一主键之类的功能。它效率很低,但对他们来说已经足够了,而且在灾难恢复场景中更易于管理。

您需要一个主键来强制其列子集的唯一性(如果需要引用单个行,则很有用)。由于与之相关联的索引,它还加快了某些查询的速度

如果不需要该索引或唯一性约束,则可能不需要主键(索引不是免费的)


我想到的一个例子是日志记录表,它只记录一些数据(从未更新或查询个别记录)。

您需要一个主键来强制其列子集的唯一性(如果需要引用个别行,则很有用)。由于与之相关联的索引,它还加快了某些查询的速度

如果不需要该索引或唯一性约束,则可能不需要主键(索引不是免费的)


我想到的一个例子是日志记录表,它只记录一些数据(从未更新或查询个别记录)。

插入带有索引的表时会有一点开销,如果有主键,则需要索引。当然,不利的一面是,找一个排是非常昂贵的

插入到带有索引的表时,开销很小,如果有主键,则需要索引。当然,不利的一面是,找一个排是非常昂贵的

我认为PK在几乎所有情况下都是强制性的。有很多原因,但我会处理其中的一些

  • 防止插入重复行
  • 行将被引用,因此它必须有一个键

我看到很少有案例制作没有PK的表格(例如日志表格)。

我认为PK对几乎所有案例都是强制性的。有很多原因,但我会处理其中的一些

  • 防止插入重复行
  • 行将被引用,因此它必须有一个键
我看到很少有案例制作没有PK的表格(例如日志表格)。

有什么正当理由吗?我会说“不”——我是一个数据库专家——但有些地方坚持把数据库当作一个愚蠢的数据存储。它们通常在应用程序代码中实现所有完整性“约束”

将完整性约束放入应用程序代码中通常不是为了提高性能。事实上,如果您构建了一个实施所有已知约束的数据库,并且您构建了另一个仅在应用程序代码中具有功能相同约束的数据库,那么第一个数据库几乎肯定会围绕第二个数据库运行

相反,应用程序级约束通常希望增加灵活性。(而且,在这个过程中,一些已知的约束通常会被删除,这似乎会提高性能。)如果为了批量加载一些杂乱的数据而强制执行某些约束变得不方便,应用程序程序员可以暂时避开应用程序级约束,然后在更方便的时候清理数据。

有什么正当理由吗?我会说“不”——我是一个数据库专家——但有些地方坚持把数据库当作一个愚蠢的数据存储。它们通常在应用程序代码中实现所有完整性“约束”

将完整性约束放入应用程序代码中通常不是为了提高性能。事实上,如果您构建了一个实施所有已知约束的数据库,并且您构建了另一个仅在应用程序代码中具有功能相同约束的数据库,那么第一个数据库几乎肯定会围绕第二个数据库运行


相反,应用程序级约束通常希望增加灵活性。(而且,在这个过程中,一些已知的约束通常会被删除,这似乎会提高性能。)如果为了批量加载一些杂乱的数据而强制执行某些约束变得不方便,应用程序程序员可以暂时避开应用程序级约束,然后在更方便的时候清理数据。

不是Oracle特有的,但我记得读到过一个这样的用例,我认为它是为dam(发电)项目高度定制的。来自传感器的输入数据在每秒100-1000左右。他们对每条记录使用时间戳,因此不需要主键(就像这里的另一个答案中提到的日志/日志记录)

因此,很好的理由是:

  • 在高频交易的情况下,管理费用
  • 在那种情况下是必要的还是不必要的