как работать со связями «многие ко многим» в 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) к Plantтаблице и к Chemicalтаблице. Внешний ключ к Plantтаблице должен каскадировать удаления, так что вы можете легко удалить растение. Внешний ключ к Chemicalтаблице долженнеткаскадное удаление, поскольку вы не должны иметь возможности удалить химическое вещество, содержащееся в растении.

Хорошей идеей будет создать уникальный индекс по названиям растений и химических веществ, чтобы ускорить поиск и избежать дублирования записей.

в Access Plant.PlantIDи Chemical.ChemicalIDдолжны быть AutoNumberстолбцы.

PlantChemical.PlantIDи PlantChemical.ChemicalIDдолжны быть Numeric Longстолбцами.


В пользовательском интерфейсе позвольте пользователю выбрать одно растение из 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 есть мнения о порядке имен столбцов в частях on соединений, но нет... Access прямо сейчас.0

Связанный контент