Comme d'autres l'ont déjà suggéré, la relation plusieurs à plusieurs est représentée dans le modèle physique par une table de jonction. Je vais faire le travail des jambes et illustrer cela pour vous :
Le CATEGORY_ITEM est la table de jonction. Il a un PK composite composé de FK migrés à partir des deux autres tables. Exemple de données...
CATÉGORIE :
CATEGORY_ID CATEGORY
----------- --------
1 Apple
2 Orange
ÉLÉMENT :
ITEM_ID NAME
------- ----
1 Foo
2 Bar
CATEGORY_ITEM :
CATEGORY_ID ITEM_ID
----------- -------
1 1
2 1
1 2
Ce qui précède signifie :"Foo est à la fois Apple et Orange, Bar n'est qu'Apple" .
Le PK garantit qu'une combinaison donnée de catégorie et d'élément ne peut pas exister plus d'une fois. La catégorie est soit connectée à l'élément ou n'est pas - elle ne peut pas être connectée plusieurs fois.
Étant donné que vous souhaitez principalement rechercher des éléments d'une catégorie donnée, l'ordre des champs dans le PK est {CATEGORY_ID, ITEM_ID} afin que l'index sous-jacent puisse satisfaire cette requête. L'explication exacte pourquoi est au-delà de cette portée - si vous êtes intéressé, je vous recommande vivement de lire Utiliser l'index, Luke ! .
Et puisque InnoDB utilise le clustering , cela stockera également les éléments appartenant à la même catégorie physiquement proches les uns des autres, ce qui peut être plutôt bénéfique pour les E/S de la requête ci-dessus.
(Si vous souhaitez interroger les catégories de l'élément donné, vous devez inverser l'ordre des champs dans l'index.)