
Я пытаюсь настроить новую базу данных 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