Som andra redan har föreslagit, representeras många-till-många-relationer i den fysiska modellen av en korsningstabell. Jag ska göra benarbetet och illustrera det för dig:
CATEGORY_ITEM är korsningstabellen. Den har en sammansatt PK som består av FK:er migrerade från de andra två tabellerna. Exempeldata...
KATEGORI:
CATEGORY_ID CATEGORY
----------- --------
1 Apple
2 Orange
ARTIKEL:
ITEM_ID NAME
------- ----
1 Foo
2 Bar
CATEGORY_ITEM:
CATEGORY_ID ITEM_ID
----------- -------
1 1
2 1
1 2
Ovanstående betyder:"Foo är både Apple och Orange, Bar är bara Apple" .
PK säkerställer att en given kombination av kategori och artikel inte kan existera mer än en gång. Kategorin är antingen kopplad till objektet är inte - den kan inte kopplas flera gånger.
Eftersom du i första hand vill söka efter objekt i en given kategori, är ordningen på fälten i PK {CATEGORY_ID, ITEM_ID} så att det underliggande indexet kan uppfylla den frågan. Den exakta förklaringen till varför ligger utanför denna ram - om du är intresserad rekommenderar jag varmt att läsa Use The Index, Luke ! .
Och eftersom InnoDB använder klustring , kommer detta också att lagra objekt som tillhör samma kategori fysiskt nära varandra, vilket kan vara ganska fördelaktigt för I/O i frågan ovan.
(Om du vill fråga efter kategorier för det givna föremålet, måste du vända ordningen på fälten i indexet.)