
植物とそれに含まれる化学物質を関連付ける新しいアクセス データベースを設定しようとしています。多くの植物に同じ化学物質が含まれている可能性があり、同じ植物に複数の化学物質が含まれていることは明らかであるため、これは多対多の関係であると理解しています。ジャンクション テーブルを設定して、その方法で多対多の関係を作成しようとしましたが、データベースを構築してデータを入力するときに、どの化学物質がどの植物に含まれているかを Access に伝える方法がまだわかりません。このプロジェクトをすぐに開始する必要があるため、ご助力いただければ幸いです。
答え1
各植物/化学物質の組み合わせが 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
。これは、各化学物質を特定のプラントに 1 回だけ割り当てるためです。プラントには複数の化学物質を含めることができ、化学物質を複数のプラントに割り当てることもできます。
ジャンクションテーブルには、テーブルとテーブルへのPlantChemical
外部キー(FK)があります。テーブルへの外部キーはカスケード削除を行う必要があります。これにより、プラントを簡単に削除できます。テーブルへの外部キーは、Plant
Chemical
Plant
Chemical
ないカスケード削除は、植物に含まれる化学物質を削除できないようにするためです。
検索を高速化し、重複エントリを回避するために、植物名と化学物質名に一意のインデックスを作成することをお勧めします。
Access ではPlant.PlantID
列Chemical.ChemicalID
である必要がありますAutoNumber
。
PlantChemical.PlantID
PlantChemical.ChemicalID
列である必要がありますNumeric Long
。
UI で、ユーザーがPlant
テーブルから 1 つの植物とテーブルから複数の化学物質を選択できるようにします。これらの化学物質ごとに、指定されたおよびChemical
を使用してジャンクション テーブルに 1 つのレコードを挿入します。PlantID
ChemicalID
次に、ユーザーは別の植物を選択し、そこで同じ操作を行います。
答え2
主キー PlantId を持つテーブル Plant と、主キー ChemicalId を持つテーブル Chemical を想定します。
テーブル PlantChemical には、PlantId と ChemicalId の 2 つの列があります。これらの各列にインデックスが必要です。目的は各プラントと各化学物質に複数のエントリを設定することであり、プラントから化学物質 (以下のサンプル クエリでは PlantId のインデックスが必要) に移動し、化学物質からプラント (ChemicalId のインデックスが必要) に移動するため、一意のインデックスではありません。そのため、AutoIncrement 列を主キーとして配置することをお勧めします (私はそうします)。
次に、この2つを次のように関連付けます。
select *
from Plant p
inner join PlantChemical pc on pc.PlantId = p.PlantId
inner join Chemical c om c.ChemicalId = pc.ChemicalId
(これは Access の構文としては正しくないかもしれません。Access には結合の 1 つの部分における列名の順序に関する意見があることを覚えていますが、今のところは…Access にはありません。0