3

我目前正在通过MS Access 2003开发数据库,​​并陷入循环引用问题。基本上,它归结为下列关系三角形(这是我的关系表的简化形式):数据库设计中的循环引用 - 是否应该避免?

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

其中位置,员工和软件是表,并"oo-------...-------oo"显示器之间的多对多的关系他们。

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

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

在此先感谢, VS.

回答

0

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

0

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

  • 员工
  • 软件
  • EmployeeSoftware
  • 位置

的 “阵地” 表在你的情况,我认为,是你的角色。请注意,数据库应该用作存储,并且应该将最小的业务逻辑放置在那里。话虽这么说,......让我继续

会有员工和EmployeeSoftware(EMPID存在于EmployeeSoftware外键。同样对于软件和EmployeeSoftware(SoftID的存在于EmployeeSoftware外键之间的关系。

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

+0

谢谢,伙计们。但是,我的初始结构中的循环关系在这里确实是一个问题?拥有它有什么可能的后果?有没有任何算法来分析可能的错误/怪异行为? – user459459 2010-09-27 14:22:40

+0

允许您选择对数据库执行任何操作(在您的情况下为循环引用)“OK”。有没有任何解决方法?...取决于。你是否看过视图?......也许你可以用一些视图来按照你选择的方式来构造数据。 – 2010-09-27 15:26:50

+1

如果您在思考得足够远以便担心糟糕的设计决策带来的后果,那么为什么您仍在使用Access? – Sorpigal 2010-09-27 18:17:17

1

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

在我看来,这是一个常见的问题,与地址问题同构,即,一个人可以拥有一个个人地址并继承雇主的地址,而@Saif Khan的解决方案是从一个位置消除软件继承,这是一种非规范化的形式,因为您已经将两个复杂的实体关系合并为一个。我从来不知道如何对此进行建模,不是因为潜在的循环关系,而是因为汇编所有软件/地址的单个结果集(这需要使用UNION)而导致的性能问题(以及不可编辑性)。我会试图用触发器来复制从该位置继承的软件,并将该人与该软件连接起来。

在A2010之前,这在Access/Jet/ACE的引擎级别是不可能的,但A2010增加了表级数据宏,可用于实现触发器的等效功能。这可能是这种新功能可以让你用触发器实现这个结构的情况。

但我不确定我是否适合复制数据,即使触发器允许您在引擎级同步复制数据。

0

我觉得这个数据库的设计变得过于复杂的,因为处理异常的方式,

“一些员工被授予 使用其他软件 包的极少数,除了它们是什么 允许根据自己的 位置(S)。

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

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

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