3

我目前正在通过 MS Access 2003 开发数据库,​​但遇到了循环引用问题。基本上,它归结为以下关系三角形(它是我的关系表的简化形式):

                     Positions
                 oo            oo
                /                \
               /                  \
              /                    \
             /                      \
            /                        \
           /                          \
          /                            \
         /                              \
        /                                \
       /                                  \
      oo                                  oo
  Employees  oo -------------------- oo Software,

其中 Positions、Employees 和 Software 是表格,并"oo-------...-------oo"显示它们之间的多对多关系。

简而言之,公司中的所有员工都被分配到特定的职位(其中一些被分配到多个职位),并且有权根据他们的职位使用特定的软件。但是,也有例外,除了根据他们的职位允许他们使用的软件包之外,一些员工还被授予使用少数其他软件包的权限。

问题是,在这种数据库中允许循环关系可以吗?是否有任何不需要非规范化的解决方法?

在此先感谢,VS。

4

4 回答 4

1

您的图表是椭圆的,因为您忽略了所有实体之间的 N:N 连接表。这些对循环关系的副作用产生了巨大的影响。使用 CASCADE DELETE 的直接 1:N 关系可能会导致实际问题和潜在的死锁。但是在 N:N 表之间,你不应该有这个问题,因为 CASCADE DELETE 只会从第一个表“下坡”运行到 N,而不是从 N:N 表备份到另一个表父表。

在我看来,这是一个常见的问题,与地址问题同构,即一个人可以有一个个人地址并从雇主那里继承一个地址,而@Saif Khan 从职位中消除软件继承的解决方案是一种形式非规范化,因为您已经将两个复杂的实体关系折叠成一个。我从来不知道如何对此建模,不是因为潜在的循环关系,而是因为组装所有软件/地址的单个结果集带来的性能问题(和不可编辑性),这需要一个 UNION。我很想使用触发器来复制从该职位继承的软件,并带有将人与软件相关联的记录。

在 A2010 之前,这在 Access/Jet/ACE 中的引擎级别是不可能的,但 A2010 添加了表级数据宏,可用于实现触发器的等效项。这可能是新功能允许您使用触发器实现此结构的情况。

但是我不确定我是否对复制数据感到满意,即使触发器允许您在引擎级别保持复制数据的同步。

于 2010-09-27T18:12:41.930 回答
0

您需要正确规范化数据库。恕我直言 - 我不会在职位表中使用关系。这是我要做的

  • 员工
  • 软件
  • 员工软件
  • 位置

我假设您的“职位”表是您的角色。请注意,数据库应该用作存储,并且应该在其中放置非常少的业务逻辑。话虽如此,......让我继续

Employee 和 EmployeeSoftware 之间会有关系(empid 在 EmployeeSoftware 中作为外键出现。Software 和 EmployeeSoftware 也是如此(softid 在 EmployeeSoftware 中作为外键出现。

应用程序在插入记录之前首先检查一个人是否在正确的位置 (POSITIONS) 表中。对于额外的数据库检查,您可以在 EmployeeSoftware 上添加检查约束以检查 POSITIONS 数据库,然后......然后需要软件和职位之间的关系。

于 2010-09-27T13:12:34.283 回答
0

您可以通过为每个异常生成新位置来避免它。如果需要,然后可以将布尔标志添加到位置以区分实际位置和异常生成位置。

于 2010-09-27T13:04:47.163 回答
0

我认为由于处理异常的方式,这个数据库设计变得太复杂了,

“除了根据他们的职位允许他们使用的软件包之外,一些员工还被允许使用一些其他的软件包。

不要试图将员工直接链接到软件。

我只是创建另一个职位,因为在这种情况下职位的主要目的是确定软件访问权限。即使一个人有一个唯一的软件列表,他们将来也会被替换,这个人可以被分配到相同的位置。

查询会更容易。正如 David-W-Fenton 指出的那样,您将不得不使用很多工会来找出谁可以使用什么软件,反之亦然。

于 2010-09-27T21:11:57.057 回答