修改数据库 table 个最佳实践
Modify database table best practices
正如我的标题所述,我很好奇在 (mysql) 数据库中修改现有 table 的最佳做法。在我的场景中,我有一个已经充满数据的 table 并且有一个名为 product_id
的列,该列当前是 table 的主键。我正在开发一项功能,我发现 product_id
不一定需要是唯一的或主键,因为我想允许同一产品有多个记录。数据库设计还不是我的强项,但在我看来我想做的是 运行 product_id
列的命令 DROP PRIMARY KEY,然后添加一个名为 id
并将其设为新的主键。然后,我需要为每条记录更新 id
列,使其成为有效的主键。就数据库设计而言,这是执行此操作的最佳做法还是使用更新的结构创建新的 table 并将当前记录复制到新的 table 中更好?
编辑:
有关我正在开发的功能的更多信息。这些产品是书籍,我正在尝试允许预览这些书籍的多个部分。为此,我存储了可以预览的页面范围。现在,只允许一个页面范围,这就是产品 ID 不再需要唯一的原因。
主键始终是唯一的。
为什么不希望它是独一无二的?听起来您正在将密钥暴露在数据库之外,PK 以某种方式可见,并且某些用户认为它的行为应该有所不同。如果是这种情况,那么这是一个非常糟糕的做法。
这就是臭名昭著的典型案例"natural keys"。它们是一场等待发生的灾难;我不喜欢大定时炸弹。一段时间以来,我一直强烈反对他们。他们在学校教他们很好,这样你就知道在现实世界中不要使用什么。
现在是解决方案。如果product_id
暴露了,那根本就不应该是PK。解决方案?
- 创建一个新列(
id
也许?),它是内部的、唯一的、不向用户公开的,同时保持 product_id
。这个新列最初可能与 product_id
具有完全相同的值。
- 将所有 FK 引用从其他表更改为新的
id
列。
- 然后,从
product_id
中删除PK约束并用它做任何你想做的事情。
- 将 PK 约束添加到新的
id
列。
正如我的标题所述,我很好奇在 (mysql) 数据库中修改现有 table 的最佳做法。在我的场景中,我有一个已经充满数据的 table 并且有一个名为 product_id
的列,该列当前是 table 的主键。我正在开发一项功能,我发现 product_id
不一定需要是唯一的或主键,因为我想允许同一产品有多个记录。数据库设计还不是我的强项,但在我看来我想做的是 运行 product_id
列的命令 DROP PRIMARY KEY,然后添加一个名为 id
并将其设为新的主键。然后,我需要为每条记录更新 id
列,使其成为有效的主键。就数据库设计而言,这是执行此操作的最佳做法还是使用更新的结构创建新的 table 并将当前记录复制到新的 table 中更好?
编辑: 有关我正在开发的功能的更多信息。这些产品是书籍,我正在尝试允许预览这些书籍的多个部分。为此,我存储了可以预览的页面范围。现在,只允许一个页面范围,这就是产品 ID 不再需要唯一的原因。
主键始终是唯一的。
为什么不希望它是独一无二的?听起来您正在将密钥暴露在数据库之外,PK 以某种方式可见,并且某些用户认为它的行为应该有所不同。如果是这种情况,那么这是一个非常糟糕的做法。
这就是臭名昭著的典型案例"natural keys"。它们是一场等待发生的灾难;我不喜欢大定时炸弹。一段时间以来,我一直强烈反对他们。他们在学校教他们很好,这样你就知道在现实世界中不要使用什么。
现在是解决方案。如果product_id
暴露了,那根本就不应该是PK。解决方案?
- 创建一个新列(
id
也许?),它是内部的、唯一的、不向用户公开的,同时保持product_id
。这个新列最初可能与product_id
具有完全相同的值。 - 将所有 FK 引用从其他表更改为新的
id
列。 - 然后,从
product_id
中删除PK约束并用它做任何你想做的事情。 - 将 PK 约束添加到新的
id
列。