0

我觉得这是一个有点“愚蠢”的问题,但无论如何,它可能对其他人有用。它也有点长,因为我想介绍一下我的情况。

背景:
我正在开发一个数据库应用程序,以使我们能够“跟踪”各种项目的费用。我确信已经有一个可以做到这一点的应用程序,但我仅限于使用 VBA,所以 MS Access。有人告诉我,他们不想学习“新”东西,而且我确信任何其他“新”产品都需要进行大量“调整”才能提供我们需要的所有“补充”功能和细节.

问题(S):
这些可能是围绕我的原则问题的敲门声,欢迎您的想法,如果它可能会导致有趣的讨论,我很乐意将每一点分成一个新问题,但我包括这些东西在这里完成。

我有多个表,它们以“路径”相互链接,因此每个表都存储信息。为简单起见,让我们将其视为项目:位置(地理):要访问的人(实际上,该路径中还有另外 4 个表,但是...)由于每个位置都可以存在于每个项目中,因此我有一个链接的“project_2_location”表这些表在一​​起,以及每个中间表之间的另一个“链接”表。因此,如果表是 ABC 和 D,则链接表是 A_2_B:B_2_C:C_2_D:等...(我不做 A_2_C 和 A_2_D)。

我也有“大量”的 2 列“查找”表(事实上,我的“查找”类型表比“真实”表要多,这让我在“设计视图”中更加恼火)。

我的主要问题/问题。我还有另一组“一组”桌子让我感到“悲伤”,因为这是最好的继续。正是这些是我“问题”的根源。

我有 2 个表在 one_to_many 关系中链接,我使用父表中的“单一”值链接到子表(子表有自己的代理键)

显然他们对“子”表中的细节并不特别感兴趣,但我创建它是因为它是使界面工作并保持某种“第一范式”的最方便的方式。

现在我已经创建了这个子表,我知道他们将来会想要对它运行查询(即使他们现在说他们不这样做!)。为此,他们将“必须”在它、父表和他们的父表之间创建一个连接,以提取他们想要的所有信息。

所以简而言之,我有

祖父(充当项目名称的查找表)。

Parent(它有一个指向 Grandparent PK 的外键,并且是 'oneGranparent_to_ManyParent 类型的关系)。

Child(它有一个外键到 Parent 的 PK,并且是 'oneParent_to_ManyChild 类型的关系)。

因此,我想到了以下解决方案。

1)在孩子中添加一个指向祖父母的PK字段的字段(快速简单但多余,除了为将来人们想要搜索此子表时添加易用性)。

2)添加一个链接表,将祖父母中的 PK 链接到孩子中的 PK(这似乎足够合理,并且将导致搜索仅连接 2 个表)

3)别管闲事,(任何未来的搜索都需要将孩子加入父母和祖父母 - 这对于这里的“非”程序员来说可能太多了!)。目前我还没有被要求提供这个搜索,所以“对不起他们”,我确实提供了,但回答是“不,我们不需要那个”

4)我缺少其他一些解决方案。

就我个人而言,我倾向于使用解决方案#1,但喜欢使用#3(出于血腥的头脑)运行,我可能会在开发说明中记录所需的 SQL 以创建搜索。

非常欢迎您的想法和其他解决方案(例如影子表和连接表的预创建(在#3 中通过存储过程在有人打开应用程序时运行)。

4

1 回答 1

1

很难用所有的“引号”来阅读这个——但是做了类似工作的一些想法:

出于几个原因,我不喜欢创建不必要的表格。首先,当源数据发生变化时很容易忘记更新额外的表,所以事情可能会过时。如果您确实创建了这些表,并且有超过一两个步骤来更新它们,请考虑使用宏来整合所有更新步骤。其次,它通常是不必要的。所以我不喜欢你的选项2。

出于同样的原因,我对选项 1 有同样的感觉——我不喜欢创建额外的、不必要的字段,或者不必担心保持它们是最新的。

所以剩下的选项 3 - 这对我来说听起来不是一个糟糕的选择。我没有看到连接多个表的查询有任何基本问题。在您的情况下,祖父母 - 父母 - 孩子链接似乎很容易使用和理解。您可以将其设置为标准查询(不是新表),可以根据需要使用它来查找任何孩子的父母或祖父母,并用于您将来需要开发的任何其他查询。

至于“为他们感到难过”——我一直认为项目是迭代的。展望未来并预测未来的需求是很棒的,但我从不期望预先完全定义所有需求。每一个答案和每一个新能力似乎总是会产生新的问题。变通。

于 2013-05-07T12:29:52.900 回答