2

我敢肯定这以前会被问到,但我很困惑!

假设我有一个 SQL Server 数据库,其中包含以下表格

在此处输入图像描述

和数据...

INSERT [dbo].[Organisation] ([id], [name]) VALUES (1, N'ABC Ltd')
INSERT [dbo].[Organisation] ([id], [name]) VALUES (2, N'XYZ Ltd')

INSERT [dbo].[Employee] ([id], [name], [organisationId]) VALUES (1, N'Dave', 1)

INSERT [dbo].[Message] ([id], [text], [employeeId], [created]) VALUES (1, 'My 1st message', 1, '2012 01-01 00:00:00')
INSERT [dbo].[Message] ([id], [text], [employeeId], [created]) VALUES (2, 'My 2nd message', 1, '2012 01-02 00:00:00')
INSERT [dbo].[Message] ([id], [text], [employeeId], [created]) VALUES (3, 'My 3rd message', 1, '2012 01-03 00:00:00')

因此,我们可以看到在 ABC Ltd 工作的 Dave 连续 3 天创建了 3 条消息。世界上一切都很好。

如果事实证明 Dave 从未为 ABC Ltd 工作,但实际上为 XYZ Ltd 工作,那很好,我们更改组织 ID,仅此而已。

但是,如果他确实为 ABC 工作,但后来在 2012-01-02 更改为 XYZ Ltd,我该怎么办。

任何询问每个组织提出了多少消息的报告,如果在我们更改 Daves 组织 ID 的前一天运行,ABC 会显示 100%,如果后天运行,XYZ 会显示 100%。错,错,错!!

我的问题不是让某人来解决这个难题,而是向我指出我可以研究的可以帮助我的主题的方向。

我今天一直在搜索以下术语“数据仓库”、“基于时间的系统”和“时态数据库”,并阅读了一些非常令人困惑的文章(对我来说很困惑,我相信它们是很棒的文章)。

那么,那里的任何人都可以通过向正确的方向轻推我来帮助我吗?我相信你可以从这条消息中得知我需要一个关于这个主题的“傻瓜”指南......不管那个主题是什么!!!

干杯。

4

4 回答 4

1

但是,如果他确实为 ABC 工作,但后来在 2012-01-02 更改为 XYZ Ltd,我该怎么办。

您刚刚定义了多对多关系。一个员工可以为多个组织工作,一个组织拥有多个员工。

从这篇关于数据规范化的维基百科文章开始。在 Google 图片中搜索“多对多关系”。这些图像将引导您做出一些很好的解释。

于 2012-04-30T17:11:19.160 回答
0

这是一种非常简单的方法来模拟这种情况:

在此处输入图像描述

从本质上讲,您不是将信息与员工(人)联系起来,而是与特定的就业时期联系起来。假设这很好用:

  • 失业人员永远不能与消息相关联。
  • 您满足于在应用程序级别强制执行时间关系。例如,Message.Created应该属于相应Employment的 'StartDateTerminationDate,但数据库本身不会强制执行它(至少不是声明式的)。
于 2012-04-30T23:43:28.977 回答
0

多年来,我多次看到同样的问题出现。这是未能认识到“这是 Dave 现在(或我们最后一次检查)工作的地方”与“这是 Dave 工作历史的一部分”不同的关系。工作历史关系是有状态的,因为每个关联都有一个开始日期和可以为空的结束日期。我第一次看到这种设计模式是在健身俱乐部会员系统中。

显然,您不想使用“Dave 现在工作的地方”关系来查询消息数据。我可以想到 2 种方法来解决眼前的问题:要么将消息直接与公司相关联,要么按照工作历史推导出公司。在实践中,我看到后一种方法变得过于复杂。如果你决定走那条路,请确保你从你关心的数据方面得到了一些东西。当然,您应该考虑采用简单的解决方案,只捕获您知道自己关心的直接消息/公司关系。这也可以解决戴夫兼职的情况。

于 2012-04-30T20:08:31.433 回答
0

好的,当您需要按时间报告时,您需要以这种方式存储数据。因此,不要将这些视为规范化表,您需要将它们视为查找表,然后将所需的值存储在消息表中。

这不是非规范化,因为数据会随着时间而变化。因此,例如,如果我有一条消息需要知道是哪个组织发送的以及哪个员工发送的,那么我需要将两者都存储在消息表中,而不是回复员工和组织之间的连接(我可能需要了解其他事情。)

对于某些事情,您甚至不想将 id 字段存储在最终表中,而是存储实际的文本数据。因此,如果您需要报告发送消息时的组织(或人员)的名称,您可能希望将员工姓名和组织名称以及 ID 存储在消息表中。与其他一些事情相比,消息似乎不太可能,所以让我举个例子,你有一个订单应用程序。在订单详细信息表中,您不想只存储零件编号,还希望存储零件的名称(这可能会随着时间而改变,但是当客户有问题时,他会查看您的文书工作当时寄给他)和价格(几乎肯定会随着时间的推移而改变),也许还有其他细节。

于 2012-04-30T17:20:28.923 回答