在大学实习期间,我被授权创建一个web应用程序来管理我工作的工厂的维护操作。我是一名工业工程师,对数据库编程只有一点了解,所以这个问题对你来说可能听起来很简单,我很抱歉。
是这样的情况:该项目是一个模具,需要在多次操作后进行普通维护(数量巨大,我说的是瓷砖制造,维护频率可以假设为每年一次的平均值)。我建立了一个数据库和与之相连的web应用程序,并创建了一个包含模具列表和相关累积工作的视图,以便部门负责人可以快速了解情况,看到哪些模具需要维护,这样做很好。
问题是他们"标记"了模具,我使用该数字作为数据库中的行ID。当执行维护时,需要重置累积的工作,但他希望保留有关工作操作的历史数据。
因此,我现在需要做的是,当一个项目被维护时"告诉系统",然后它必须在保留历史数据的同时重置累积值。
我创建的视图的值取自2个不同的表:mold和UnmountingOperations。在后者中,有关于模具安装在哪个压力机上以及在该操作期间完成的总工作的信息。我认为解决方案是使用触发器,但我想问:
这样做的最佳实践是什么?
这里是由SqlServer管理工作室创建的脚本。抱歉,唱片的名字是意大利语。模具表:
CREATE TABLE [dbo].[Stampo](
[ID] [int] NOT NULL,
[Formato] [nchar](10) NOT NULL,
[n∞ uscite] [int] NULL,
[Spessore] [nchar](10) NULL,
[Descrizione] [nvarchar](max) NULL,
[Fornitore] [nvarchar](50) NULL,
CONSTRAINT [PK_Stampo] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
按下表:
CREATE TABLE [dbo].[Pressa](
[Numero] [int] NOT NULL,
[Modello] [nchar](10) NULL,
CONSTRAINT [PK_Pressa] PRIMARY KEY CLUSTERED
(
[Numero] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
联合模压机卸载操作(mq_pressati)是工作量驱动程序,代表被压的平方米:
CREATE TABLE [dbo].[SmontaggioStampi](
[NumeroPressa] [int] NOT NULL,
[IDStampo] [int] NOT NULL,
[DataSmontaggio] [datetime] NOT NULL,
[mq_pressati] [int] NOT NULL,
[Descrizione] [nvarchar](max) NULL,
CONSTRAINT [PK_Produzione presse] PRIMARY KEY CLUSTERED
(
[NumeroPressa] ASC,
[IDStampo] ASC,
[DataSmontaggio] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[SmontaggioStampi] WITH CHECK ADD CONSTRAINT [FK_SmontaggioStampi_Pressa] FOREIGN KEY([NumeroPressa])
REFERENCES [dbo].[Pressa] ([Numero])
GO
ALTER TABLE [dbo].[SmontaggioStampi] CHECK CONSTRAINT [FK_SmontaggioStampi_Pressa]
GO
ALTER TABLE [dbo].[SmontaggioStampi] WITH CHECK ADD CONSTRAINT [FK_SmontaggioStampi_Stampo] FOREIGN KEY([IDStampo])
REFERENCES [dbo].[Stampo] ([ID])
GO
ALTER TABLE [dbo].[SmontaggioStampi] CHECK CONSTRAINT [FK_SmontaggioStampi_Stampo]
GO
至于最佳实践,"像避免瘟疫一样避免触发"是我能给你的最好建议。
在类似的情况下,我所做的是添加一个列,表示一行现在已存档。我用的是datetime
列,叫做ArchivedDt
。正常查询排除此列,如:
where ArchivedDt is null
你甚至可以在视图中这样做。分层数据仍然存在,并且可以很容易地撤消特定的归档运行。