【问题标题】:Access 2007 one-to-two columns referential integrityAccess 2007 一对二列的参照完整性
【发布时间】:2009-11-13 16:53:45
【问题描述】:

设置:
一张名为 documents 的表,其中包含 author_idreviewer_id 列(等等)。
一张名为users 的表,列user_id

我需要创建两个参照完整性链接:
user_idauthor_id 之间的一对多。
user_idreviewer_id 之间的一对多。

换句话说,documents 中的这两列相互独立,但两者的值都应该是有效的 user_id

添加这些关系中的任何一个都可以正常工作。当我尝试在 Edit Relationships 窗口中添加第二个关系时,Access 抱怨以下消息:

Microsoft Office Access 无法为此关系强制实施参照完整性。

我已经搜索过,但找不到任何解决方案。关于如何配置这种关系的任何想法?

【问题讨论】:

  • user_id是users中的主键吗?
  • 我创建了您上面的内容,没有任何问题,是否缺少任何细节?
  • 不要忘记 CHECK 约束或表验证规则,以确保 author_id reviewer_id ;)

标签: ms-access ms-access-2007


【解决方案1】:

要将一个表中的两个单独关系添加到另一个表中的两个不同字段,您需要在关系窗口中有多个父表实例。

因此,您需要将用户和文档表添加到关系窗口并创建第一个关系。然后再次将 Users 表添加到关系窗口(它将别名为 Users_1),然后从这个别名副本中添加第二个关系。

这与您在 QBE 中定义两个这样的连接的方式完全一致,所以我认为这根本没有问题。但这并不一定很明显!

【讨论】:

  • 我知道它是如何工作的,谢谢!然后是一个快速跟进的问题 - 在什么情况下,您会在“编辑关系”窗口中使用多行?
  • +1 表示您对 Access UI 工具的敌意“一贯不直观”的评论:)
  • @GuinesseFan 在关系窗口中,如果您只是将列从一个表拖到另一个表,它会为您创建第二个别名表。
  • 将我的评论解释为“始终不直观”,虽然可能很有趣,但这绝不是我的建议。如果您将 QBE 作为更熟悉的用于创建连接的用户界面,您会意识到添加第二个表实例会带来更多好处,因为在两个表之间创建两条连接线会创建一个双字段连接,这不是在 Jet/ACE RI 中是可执行的或可创建的。要在 QBE 中创建独立连接,您需要添加另一个表的第二个实例,就像在关系窗口中所做的那样。没有什么违反直觉的。
  • “双字段连接,在 Jet/ACE RI 中不是可执行或可创建的”——这是什么意思? RI = 参照完整性,对吧?但这与 JOIN 有什么关系?当然,您确实可以对双字段键强制执行 RI。也许“RI”是“UI”的拼写错误?
【解决方案2】:

这不是您问题的直接答案,但如果我是您,我会使用另一个数据模型来实现 DocumentsUsers 之间的复杂多对多关系,方法是创建名为 @987654323 的第三个表@ 包含以下字段:

PK  documentUser_id (*)
FK  document_id
FK  user_id
    documentUser_type

(*) or you could alternatively use document_id + user_id as a PK... 

documentUser_type 字段将保存关系类型,即“用户”、“评论者”等。通过使用此模型,您可以为同一本书拥有多个用户和/或多个评论者,这可能更接近于现实。您甚至可以拥有其他关系类型,例如“作者”等。

【讨论】:

    【解决方案3】:

    首先,我建议您将列名分别更改为author_user_idreviewer_user_id,以明确每个引用user_id

    其次,您应该知道,使用 Access 的 UI 工具不是强制性的。我们中的许多人发现它们不直观,但很高兴还有其他选择。一种是使用 SQL DDL,例如ANSI-92 Query Mode:

    ALTER TABLE Documents ADD 
       CONSTRAINT fk__ document_author_user_id__Users
       FOREIGN KEY (author_user_id)
       REFERENCES Users (user_id)
       ON DELETE NO ACTION
       ON UPDATE NO ACTION
    ;
    
    ALTER TABLE Documents ADD 
       CONSTRAINT fk__ reviewer_user_id__Users
       FOREIGN KEY (reviewer_user_id)
       REFERENCES Users (user_id)
       ON DELETE NO ACTION
       ON UPDATE NO ACTION
    ;
    

    第三,考虑您可能需要一个CHECK 约束(或表[原文] 验证规则)以确保用户无法查看他们自己的工作,例如

    ALTER TABLE Documents ADD 
       CONSTRAINT document_author_cannot_review_their_own_work
       CHECK (author_user_id <> reviewer_user_id)
    ;
    

    【讨论】:

      猜你喜欢
      • 2011-09-17
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多