【问题标题】:One to One relationship modeling一对一关系建模
【发布时间】:2013-05-04 20:59:53
【问题描述】:

我正在使用 access 2010 来执行此操作。

我已经创建了两个表,我想将其一对一地设置,但我似乎没有将其设置为一对一的关系。

CREATE TABLE Person(
ID VARCHAR(1) UNIQUE,
Name VARCHAR(30),

PRIMARY KEY (ID)
);

CREATE TABLE Passport(
ID VARCHAR(1) UNIQUE,
Country VARCHAR(30),
PRIMARY KEY (ID),
FOREIGN KEY (ID) REFERENCES Person(ID)
);

据我所知,这应该是一对一的关系,但它是一对多的。如何通过 ACCESS 一对一获取?

我已经尝试了大多数可以在书中找到的东西,但没有成功。

请帮忙。

【问题讨论】:

  • 你怎么知道它是一对多的?如果真的是一对一的,那么所有的数据都应该在同一个表中。此外,id varchar(1) 只为您提供 256 条可能的记录。这就是你想要的吗?
  • 好的,所以它不会在关系中显示为一对一,但实际上是一对一,但它显示的是一对多。
  • 您所拥有的是one to zero or one,它与您在大多数关系数据库产品中所获得的一样接近,而无需整合到单个表中。
  • 顺便说一句,对主键列有唯一约束是多余的;主键已经被要求是唯一的。
  • 一个人完全有可能拥有不止一本护照,并且他们有护照历史(例如更新护照时),因此您可能需要一对多的关系。您只需要知道哪些当前有效。

标签: database ms-access


【解决方案1】:

您可能只是被“关系”窗口中的关系显示方式误导了。我运行了您的确切 DDL,当我在“关系”窗口中查看关系时,它看起来就像一对多...

...但是当我右键单击连接两个表的行并选择“编辑关系...”时,对话框显示它实际上是一对一的:

【讨论】:

    【解决方案2】:

    我相信事实上你已经按照自己的意愿建立了一对一的关系。

    1. 个人 ID 是唯一的
    2. 护照ID是唯一的
    3. 护照ID(唯一)等于一个人ID(也是唯一的)。
    4. 所以它是一对一的

    但是,为个人和护照设置不同的 id 以进行更清晰的设计应该是更好的设计。像这样的:

       CREATE TABLE Person(
        PERSONID VARCHAR(1) UNIQUE,
        Name VARCHAR(30),
    
        PRIMARY KEY (PERSONID)
       );
    
       CREATE TABLE Passport(
       PASSPORTID VARCHAR(1) UNIQUE,
       Country VARCHAR(30),
       PERSONID VARCHAR(1),
       PRIMARY KEY (PASSPORTID),
       FOREIGN KEY (PERSONID) REFERENCES Person(PERSONID)
       );
    

    这也适用于持有多本护照的人的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多