如何对历史数据进行建模并防止主键溢出?

问题描述 投票:0回答:2

我想将 Excel 文件中的数据移至数据库。该系统是一个集中报警系统。从远程位置收集数据并显示在监控室中。

位置具有唯一的名称和多个设备。在一个位置内,设备名称是唯一的,并且设备有多个警报。在设备内,警报名称是唯一的。在每个位置终端单元聚合警报。每个终端单元都有带有唯一 ID 的卡。每张卡都有一个用于每个警报的接线终端触点,并且每张卡都有唯一的地址。这些实体中的任何一个都可以重命名/重新寻址。数据是分层的。

我需要存储每个接线接触报警分配(关系)的历史记录。警报可以将其分配从一个联系人更改为另一个联系人。

Location             TU
|                    |
+- Device            +- Card
    |                    |
    +-- Alarm            +--Contact
        |                     |
        +----Alarm-Contact----+

我为每个实体创建了一个表。我使用人工主键作为自动递增整数。层次结构中向下的表 (Tn) 将在组合上具有唯一性约束(Tn.name、Tn-1.pk、Tn-2.pk 等,其中 Tn 是层次结构中第 (n) 个表的深度并 pk 主键)。

如果我有 10 条记录并删除了除最后一条(第 10 条)之外的所有记录,那么下一条添加的记录是否会编号为 11,还是 SQL Server 会将它们重新编号为 10->1 和新的 -> 2?如果是前者,如何防止主键溢出?我应该如何对历史数据进行建模?我应该创建与 Alarm-Contact 表具有 n-1 关系的 Alarm-Contact-History 表吗?

sql-server database-design
2个回答
2
投票

如果您只是创建一个警报-联系人-历史记录表,您将不会创建准确的历史记录。假设每张卡都可以移动到另一个 TU,当警报使用卡的触点时,您描述的历史记录将不知道该卡安装在哪个 TU 中。

也许包含卡 Id、TU Id、位置 Id 和设备 Id 的增强型警报联系历史记录会更好。这样您就可以了解生成历史记录时的准确配置。如果在中间的时间范围内发生了一些变化,您不会介意,因为您知道当时的情况。

SQL Server 将继续增加分配给标识符的值。您预计有多少记录?如果数量很大(~ 21.4 亿),我建议使用 bigint 作为标识符。


-2
投票

我建议一个不同的计划。

作为热身,将数据从 Excel 转换为 MS Access。 转换非常容易,因为 Excel 和 Access 可以互操作。

不要使用自动递增数字。 相反,安排一个用 VBA 编写的函数或其他任何函数,以便在插入新数字时运行。 创建您自己的算法来控制新号码的分配,而不是受 DBMS 的支配。

使用 MS Access 中的交互式查询生成器等可以帮助您获得练习或节省您的精力。 但使用 SQL 视图来弄清楚所有查询是如何工作的,即使您没有构建它们。

然后构建一个SQL Server版本。 抽象出 MS Access 的 SQL 方言所特有的功能,但使用您在构建原型时所学到的大部分知识。 您的自动增量代码将位于触发器中。

哦,顺便说一句,不要忘记你学过的理论。 它可能会派上用场。

© www.soinside.com 2019 - 2024. All rights reserved.