Udostępniam Ci mój przykład związany z kluczami obcymi. Dwie tabele:
a) tabela użytkowników (identyfikator to kolumna "id")

tabela sesji (sesji dla danego użytkownika = zwróć uwagę na kolumnę "user_id" - łączy się z tabela użytkowników dla kolumny "id")
Tabela użytkownikówCREATE TABLE IF NOT EXISTS `users`
(
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` varchar(25) NOT NULL,
`surname` varchar(32) NOT NULL,
`username` varchar(32) NOT NULL,
`email` varchar(127) NOT NULL,
`password` varchar(64) NOT NULL,
UNIQUE KEY `uniq_username` (`username`),
UNIQUE KEY `uniq_email` (`email`)
) engine = innodb DEFAULT charset = utf8;
Tabela sesjiCREATE TABLE IF NOT EXISTS `sessions`
(
`session_id` varchar(24) NOT NULL PRIMARY KEY,
`last_active` int(10) UNSIGNED NOT NULL,
`contents` text NOT NULL,
`user_id` int(10) UNSIGNED NOT NULL DEFAULT 1,
`user_ip` varchar(15) NOT NULL,
UNIQUE KEY `uniq_sid` (`session_id`, `user_id`),
INDEX fk_active_index (`last_active`),
INDEX fk_uid_index (`user_id`),
FOREIGN KEY (user_id) REFERENCES users (id) ON UPDATE cascade ON DELETE cascade
) engine = innodb DEFAULT charset = utf8;
Zapis:
Kod
foreign key (user_id) references users (id) on update cascade on delete cascade
można tłumaczyć: ~ kolumnę "user_id" (z tabeli sessions) połącz z tabelą "users" i odwołaj się do kolumny "id" (z tabeli "users") w przypadku:
a) aktualizacji rekordu ("on update"),

usunięcia rekordu ("on delete")
I gdybyś zastosował takie rozwiązanie w swoim projekcie to ograniczyłbyś zapytania typu pobierz ID działów, usuń tematy z danego działu, itd.