除了一些额外的工作,你做事的方式没有太大的问题。删除和重新创建子对象是一种常见的方法。
不得不说,自动递增的数字被推高实际上并不重要。您的所有时间表条目都应该可以通过相应的时间表外键检索。
您不应该依赖自动生成的数字。ID 字段上升应该没关系。您真正的解决方案是找到一种一致的方法来正确检索它们,而不管代理键可能是什么。
编辑
回应用户的评论。
您仍然会为 PK 和 FK 使用自动编号,但您应该将其与唯一标识大东西的方法结合起来,这通常是对象图顶部的东西。
我通过在我的数据库中包含一个别名列来实现这一点。
这是一个独特的 varchar 约束,它存在于我可能想要显式查找的任何内容上。
考虑以下示例。
CREATE TABLE OrderTypes
(
Id INT IDENTITY(1,1) PRIMARY KEY,
Name varchar(100),
Alias varchar(30),
Active bit,
...
)
现在我不想OrderType
按 Id 查找,因为如果我不得不从头开始重建数据库,那可能会改变。
我也不想OrderType
按名字查找。如果有人通过 CMS 功能更改订单类型怎么办?
Alias 概念允许我为每个订单类型提供一个短名称,该名称在任何管理屏幕上都无法编辑。
继续这个OrderType
例子,我可能给采购订单一个别名“ purchaseorder
”和销售订单和别名“ salesorder
”。
当我想获取与销售订单相关的 OrderType 行时,我可以使用:-
SELECT * FROM OrderTypes WHERE Alias = 'salesorder'
此时,您的查询具有自动生成的 ID,因此您可以根据该值进行进一步的查询。
SELECT * FROM Orders WHERE OrderTypeId = <that value I just safely derived>
这比对自动生成的 ID 进行硬编码要好得多。