正如其他人指出的那样,记录有两种类型的密钥:自然密钥和代理(人工)密钥。那么,两个主要问题是:您是否需要使用代理键,如果需要,代理键应该是什么?
关于第一个问题:如果没有有效的自然键用作表上的主键,则只需使用代理键。所有健全的数据库系统都支持“ON UPDATE CASCADE ”子句,这意味着如果您使用的自然键发生更改,则更改将传播到声明引用它的所有内容。当然,如果您的数据库系统不支持外键,那么您最好的选择是使用代理键,即使只是为了解决数据库系统中功能的缺乏(并且代理键将使您的数据库更容易进行一致性检查)鉴于这一事实)。也就是说,如果您正在设计一个需要高正常运行时间和高稳健性的应用程序,请选择一个能够正确获取外键的数据库实现,否则您很可能会发现在开发后期(甚至在维护过程中)会发现数据完整性错误)并且您将必须编写实用程序来检查数据在各种故障模式下的一致性。
对于第二个问题:如果您使用代理键,特别是当您正在解决数据库系统的缺陷时,您应该始终将其视为不可变且全局唯一的。 总是。 这将在以后的许多情况下有所帮助:公司可以合并(和拆分),数据库可以合并(和拆分),并且可能会发生大约一百万种其他情况,这些情况在数据库设计时没有预料到,这些情况可能会导致问题如果代理键不是全局唯一的。由于代理键与它们所保存的数据完全无关(除了您赋予它的人工字段之外,它们与表中的其他字段没有关系),因此最好是这种方式。由于这些原因,当我必须使用代理键时,我会使用 UUID(本质上是一个 128 位整数,但不是增量整数)。现在,当发生意外事件时,您不必担心对记录编号和引用进行重新编号。(是的,它确实会减慢速度,特别是如果您的服务器运行在 32 位平台上。但是,如果您需要处理更多负载,请更好地分配负载——永远不要为了速度而牺牲完整性,当您正在处理重要数据!)
| 归档时间: |
|
| 查看次数: |
281 次 |
| 最近记录: |