我正在尝试建立一个新的 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) 。表的外键应级联删除,以便您可以轻松地删除工厂。表的外键应该Plant
Chemical
Plant
Chemical
不是级联删除,因为您不应该删除植物中含有的化学物质。
对植物和化学名称建立唯一索引是一个好主意,以加快搜索速度并避免重复输入。
在 Access 中Plant.PlantID
应该Chemical.ChemicalID
是AutoNumber
列。
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