Como ya han sugerido otros, la relación de muchos a muchos se representa en el modelo físico mediante una tabla de unión. Haré el trabajo preliminar y te lo ilustraré:
CATEGORY_ITEM es la tabla de unión. Tiene un PK compuesto que consta de FK migrados de las otras dos tablas. Datos de ejemplo...
CATEGORÍA:
CATEGORY_ID CATEGORY
----------- --------
1 Apple
2 Orange
ARTÍCULO:
ITEM_ID NAME
------- ----
1 Foo
2 Bar
CATEGORY_ITEM:
CATEGORY_ID ITEM_ID
----------- -------
1 1
2 1
1 2
Lo anterior significa:"Foo es tanto Apple como Orange, Bar es solo Apple" .
El PK garantiza que cualquier combinación dada de categoría y artículo no pueda existir más de una vez. La categoría está conectada al elemento o no lo está; no se puede conectar varias veces.
Dado que principalmente desea buscar elementos de una categoría dada, el orden de los campos en PK es {CATEGORY_ID, ITEM_ID} para que el índice subyacente pueda satisfacer esa consulta. La explicación exacta de por qué está más allá de este alcance. Si está interesado, le recomiendo leer Use The Index, Luke ! .
Y dado que InnoDB usa agrupamiento , esto también almacenará elementos que pertenecen a la misma categoría físicamente juntos, lo que puede ser bastante beneficioso para la E/S de la consulta anterior.
(Si desea consultar las categorías del elemento dado, debe invertir el orden de los campos en el índice).