非唯一的一对多关系

use*_*882 2 ms-access database-design

我是数据库设计的菜鸟,所以请耐心等待。我在 Microsoft Access 中有两个表:

表格1:

| ID | Field1 | Field2 |
|:---|--------|:-------|
| 1  |   A    |    1   |
| 2  |   A    |    2   |
| 3  |   B    |    5   |
| 4  |   C    |    8   |
| 5  |   D    |   20   |
| 6  |   E    |   32   |
| 7  |   F    |   22   |
| 8  |   F    |   7    |
Run Code Online (Sandbox Code Playgroud)

表 2:

| ID | Field1 | Field2 |
|:---|--------|:-------|
| 1  |   A    |  one   |
| 2  |   B    |  two   |
| 3  |   B    | eight  |
| 4  |   D    | seven  |
| 5  |   D    | twenty |
| 6  |   F    | thirty |
Run Code Online (Sandbox Code Playgroud)

我试图在基于 Field1 的表之间建立一对多的关系。但是 Field1 在任一表中都不是唯一的。然而,这在概念上是可能的,因为 Field1 中的每个记录在 Field2 中都有相应的记录。我可以创建一个只包含 ID 的中间表

| ID |   ID1  |  ID2   |
|:---|--------|:-------|
| 1  |   1    |   1    |
| 2  |   2    |   1    |
| 3  |   3    |   2    |
| 4  |   3    |   3    |
| 5  |   5    |   4    |
| 6  |   5    |   5    |
| 7  |   5    |   5    |
| 7  |   7    |   6    |
| 7  |   8    |   6    |
Run Code Online (Sandbox Code Playgroud)

然而,这太乏味了,因为我有数千条记录(上面的表格只是一个简化的例子)。Access 中有没有办法直接关联这些表而不必担心 ID?我知道我曾经能够使用“相关表”功能在 ArcGIS 中执行此操作,所以希望有一种方法可以在 Access 中执行此操作?

ype*_*eᵀᴹ 7

您描述的不是一对多关系而是多对多关系,因为该列Field1在两个表中的任何一个中都不是唯一的(请选择更好的名称来描述列和表,“Table1”,“ Table2", "Field1" 对表或列一无所知,非常混乱)。

根据您的要求,我看到两个选项:

  1. 如果表 1 和表 2 的行之间的关系仅通过匹配“Field1”值来推断,并且您不需要存储有关该多对多关系的更多信息,那么您不需要任何额外的表全部。Field1各个表中的 2 列 ( ) 足以找到相关数据。您可以在两个表上使用简单连接:

    SELECT 
        a.id AS ID1,
        b.id AS ID2
        -- any additional column needed from any of the 2 tables
    FROM table1 AS a
      INNER JOIN table2 AS b
        ON a.Field1 = b.Field1 ;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果表 1 和表 2 的行之间的关系不是通过匹配“Field1”值推断出来的(但有额外的条件/要求),或者您需要存储有关关系的额外信息,则需要一个中间表。为了确保(强制)只有具有相同“Field1”的行在该表中实际相关,还必须添加公共列(“Field1”)并参与两个FOREIGN KEY约束。(您还需要UNIQUE(Fieldd1, ID), 2 个表中的每一个进行约束,以使外键起作用):

    CREATE TABLE intermediate
      ( Field1 VARCHAR(5),
        ID1    INT NOT NULL,
        ID2    INT NOT NULL,
        -- possible extra columns
        PRIMARY KEY (ID1, ID2),
        FOREIGN KEY (Field1, ID1)
          REFERENCES table1 (Field1, ID),
        FOREIGN KEY (Field1, ID2)
          REFERENCES table2 (Field1, ID)
    ) ;
    
    Run Code Online (Sandbox Code Playgroud)