为什么没有主键

11 浏览
0 Comments

为什么没有主键

我继承了一个缺乏主键的数据库,它是一个OLTP数据库。其中一个表有大约300k条记录,却没有实现主键,尽管检查其余的模式告诉我一个列被用作主键,即在另一个表中被复制,具有相同的名称等。即这不是一个“末尾”表。这个数据库也没有实现外键。我的问题是 - 有没有任何合理的理由使一个表(在Oracle中)不具备主键?

0
0 Comments

为什么没有主键?

在数据库中,没有主键的原因可能是因为一些地方坚持将数据库作为一个简单的数据存储器。他们通常会在应用程序代码中实现所有完整性“约束”。

将完整性约束放入应用程序代码中通常不是为了提高性能。事实上,如果你建立了一个数据库来强制执行所有已知的约束条件,而另一个数据库中的约束条件仅在应用程序代码中实现,那么第一个数据库几乎肯定会比第二个数据库更加高效。

相反,应用程序级别的约束通常希望增加灵活性(在此过程中,有些已知的约束条件通常会被删除,这似乎提高了性能)。如果为了批量加载一些不规范的数据而不方便强制执行某些约束条件,应用程序员可以暂时绕过应用程序级别的约束条件,然后在方便时清理数据。

这正是在我的情况下他们所做的。所有完整性约束都在代码中处理。在可能的情况下,连接也是在代码中执行的。在我看来,如果数据库能够承担这些责任(并且应该),它是否会对性能造成影响?

0
0 Comments

为什么没有主键?

在某些特定情况下,没有主键的原因有很多:

1. 高频率事务的开销过大。

2. 在某些情况下,主键是不必要的。

3. “唯一性”由应用程序而不是数据库维护。

4. 在规范化的表中,如果每条记录都需要是唯一的,并且每个字段都被其他表引用,那么添加主键会增加索引的开销。即使主键在任何SQL查询中实际上都不会被使用(个人认为这是不正确的,但也有可能),仍然应该有一个包含所有字段的唯一索引。

最常见的没有主键的原因是由应用程序/代码开发人员设计数据库时缺乏数据库经验,他们想要(或者认为自己应该)在应用程序中处理所有数据约束。

0
0 Comments

为什么没有主键?

在绝大多数情况下,我认为主键是必需的。虽然有很多原因,但我将讨论其中一些。

1. 防止插入重复行:主键可以确保表中的每一行都具有唯一性,避免了重复数据的插入。

2. 行将被引用:主键是其他表中引用该表数据的关键,如果没有主键,将很难在其他表中准确地引用该表的数据。

尽管如此,我也见过很少几种情况下不使用主键的表(例如,用于存储日志的表)。

解决方法:

如果出于某些原因,需要在表中不使用主键,可以考虑以下解决方法:

1. 使用唯一索引:虽然没有主键,但可以使用唯一索引来确保行的唯一性。这样可以防止插入重复的数据。

2. 使用组合键:如果没有一个单一的列可以充当主键,可以使用多个列的组合作为唯一标识。这样可以确保行的唯一性,并在其他表中引用。

3. 使用UUID:可以使用全局唯一标识符(UUID)作为表的标识。这样可以保证每个行在全局范围内都是唯一的。

4. 使用自增列:如果没有明显的唯一标识符可用,可以考虑在表中添加一个自增列。这样每个新插入的行都会有一个唯一的标识。

虽然可以在某些情况下不使用主键,但在大多数情况下,主键仍然是保证数据完整性和引用准确性的重要工具。

0