Les messages et les catégories sont probablement plusieurs à plusieurs, et non un à plusieurs.
Une table de relations plusieurs-à-plusieurs est mieux faite quelque chose comme
CREATE TABLE a_b (
a_id ... NOT NULL,
b_id ... NOT NULL,
PRIMARY KEY (a_id, b_id),
INDEX(b_id, a_id) -- include this if you need to go both directions
) ENGINE = InnoDB;
Avec cela, vous obtenez automatiquement des recherches "groupées" dans les deux sens, et vous évitez l'identifiant artificiel inutile pour la table.
(Au fait, N.B., un PK implicite est de 6 octets, pas de 8. Il y a un long article de Jeremy Cole sur le sujet.)
Une relation un-à-plusieurs n'a pas besoin de cette table supplémentaire. Au lieu de cela, ayez un identifiant dans l'autre table. Par exemple, une table City contiendra l'identifiant du pays.