Relacja wiele do wielu zachodzi wtedy, gdy pojedynczemu rekordowi w tabeli podstawowej odpowiada jeden lub więcej rekordów w tabeli związanej, a pojedynczemu rekordowi w tabeli związanej odpowiada jeden lub więcej rekordów w tabeli podstawowej.
Wyjdźmy od czegoś takiego. Masz dwie tabele powiedzmy: tabela towary oraz zamówienia. W tabeli towary przechowujemy jakieś tam dane dotyczące produtków, które sprzedajemy, np. nazwa, opis, sww,... Masz drugą tabele: zamówienia, w której przechowujesz informacje o zamówieniach produktów przez danych klientów, np. data zamówienia, data realizacji,...
Musisz te dwa obiekty teraz ze sobą połaczyć, przy czym musisz uwzględnić następujący warunek: do jednego zamówienia może być przypisane wiele produktów, natomiast jeden produkt może być przypisany do wielu zamówień.
Wykorzystujesz do tego tzw. tabelę łączącą, w której skład wchodzą klucze podstawowe tabel towary i zamówienia (bo po czymś musimy identyfikować co to są zaproduktu lub jakie zamówienia). Dodatkowo mogę wskład tabeli łączącej wchodzić dodatkowe pola typu cena (by móc określić jaka obowiązywała cena w danym dniu dokonania zamówienia) lub ilość zamówionych towarów.
Na podstawie takiego modelu tworzysz następującą strukturę bazy danych:
CREATE TABLE TOWARY (
t_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nazwa VARCHAR(255) NULL,
opis TEXT NULL,
cena DECIMAL(10,2) NULL,
PRIMARY KEY(t_id)
);
CREATE TABLE TOWARY__ZAMOWIENIA (
t_id INTEGER UNSIGNED NOT NULL,
z_id INTEGER UNSIGNED NOT NULL,
cena DECIMAL(10,2) NULL,
ilosc FLOAT NULL,
PRIMARY KEY(t_id, z_id),
INDEX TOWARY_has_ZAMOWIENIA_FKIndex1(t_id),
INDEX TOWARY_has_ZAMOWIENIA_FKIndex2(z_id)
);
CREATE TABLE ZAMOWIENIA (
z_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
data_zamowienia DATE NULL,
data_realizacji DATE NULL,
PRIMARY KEY(z_id)
);
Teraz już się wyjaśniło - mam nadzieję, że pomogłem.
Pozdrawiam.