如何在Microsoft Access 中处理多对多关系?

如何在Microsoft Access 中处理多对多关系?

我正在尝试建立一个新的 Access 数据库,将植物与其所含化学物质关联起来。我知道这是一种多对多关系,因为许多植物可能含有相同的化学物质,而同一植物显然可以含有多种化学物质。我尝试设置一个连接表,并以此方式创建多对多关系,但在构建数据库和输入数据时,我仍然不清楚如何告诉 Access 哪些化学物质存在于哪些植物中?任何帮助都将不胜感激,因为我需要快速开始这个项目。

答案1

对于 m 对 n 关系的数据库模式,其中每个植物/化学组合只存在一次,如下所示:

Table Plant                                                     Table Chemical
+-----------+                                                   +--------------+
|PK PlantID | <----+                                      +---> |PK ChemiclaID |
+-----------+      |     Table PlantChemical              |     +--------------+
|   Name    |      |     +---------------------------+    |     |   Name       |
|           |      +----o|PK FK PlantID              |    |     |              |
|           |            |PK FK ChemicalID           |o---+     |              |
+-----------+            +---------------------------+          +--------------+
                         |      Percentage (optional)|
                         |                           |
                         |                           |
                         +---------------------------+

即,在连接表中,主键 (PK) 由PlantID和组成ChemicalID,因为您希望将每种化学品仅分配给给定工厂一次。一家工厂仍然可以拥有多种化学品,一种化学品仍然可以分配给多家工厂。

连接表具有指向表和表的PlantChemical外键 (FK) 。表的外键应级联删除,以便您可以轻松地删除工厂。表的外键应该PlantChemicalPlantChemical不是级联删除,因为您不应该删除植物中含有的化学物质。

对植物和化学名称建立唯一索引是一个好主意,以加快搜索速度并避免重复输入。

在 Access 中Plant.PlantID应该Chemical.ChemicalIDAutoNumber列。

PlantChemical.PlantID并且PlantChemical.ChemicalID应该是Numeric Long列。


在 UI 中,让用户从Plant表中选择一种植物并从Chemical表中选择几种化学品。对于每种化学品,使用给定的PlantID和将一条记录插入到连接表中ChemicalID

然后用户将选择另一个工厂并在那里执行相同的操作。

答案2

假设表 Plant 的主键为 PlantId,表 Chemical 的主键为 ChemicalId。

表 PlantChemical 将有两列:PlantId 和 ChemicalId。这些列中的每一列都应该有一个索引 - 而不是唯一索引,因为目的是为每个 Plant 和每种 Chemical 提供多个条目,并且您希望从 Plant 转到 Chemical(如下面示例查询需要 PlantId 上的索引),也希望从 Chemical 转到 Plant(因此需要 ChemicalId 上的索引)。因此,您可能希望将 AutoIncrement 列作为主键(我会这样做)。

然后你可以将两者关联起来,例如

select *
from Plant p
inner join PlantChemical pc on pc.PlantId = p.PlantId
inner join Chemical c om c.ChemicalId = pc.ChemicalId

(对于 Access 来说,这可能是不正确的语法。我记得 Access 对于连接部分中列名的顺序有自己的看法,但是现在没有……Access。0

相关内容