Come altri hanno già suggerito, la relazione molti-a-molti è rappresentata nel modello fisico da una tabella di giunzione. Farò il lavoro sulle gambe e te lo illustrerò:
CATEGORY_ITEM è la tabella di giunzione. Ha un PK composito costituito da FK migrati dalle altre due tabelle. Dati di esempio...
CATEGORIA:
CATEGORY_ID CATEGORY
----------- --------
1 Apple
2 Orange
ARTICOLO:
ITEM_ID NAME
------- ----
1 Foo
2 Bar
CATEGORY_ITEM:
CATEGORY_ID ITEM_ID
----------- -------
1 1
2 1
1 2
Quanto sopra significa:"Foo è sia Apple che Orange, Bar è solo Apple" .
Il PK garantisce che una determinata combinazione di categoria e articolo non possa esistere più di una volta. La categoria è collegata all'elemento di non lo è - non può essere collegata più volte.
Poiché desideri principalmente cercare elementi di una determinata categoria, l'ordine dei campi nella PK è {CATEGORY_ID, ITEM_ID} in modo che l'indice sottostante possa soddisfare quella query. La spiegazione esatta del perché va oltre questo scopo:se sei interessato, ti consiglio caldamente di leggere Use The Index, Luke ! .
E poiché InnoDB utilizza il clustering , questo memorizzerà anche elementi appartenenti alla stessa categoria fisicamente vicini, il che potrebbe essere piuttosto vantaggioso per l'I/O della query precedente.
(Se si desidera eseguire una query per le categorie dell'elemento specificato, è necessario invertire l'ordine dei campi nell'indice.)