Las publicaciones y categorías probablemente sean de muchos a muchos, no de uno a muchos.
Una tabla de relaciones de muchos a muchos se hace mejor algo como
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;
Con eso, obtiene automáticamente búsquedas "agrupadas" en ambas direcciones y evita la identificación artificial innecesaria para la tabla.
(Por cierto, N.B., un PK implícito es de 6 bytes, no de 8. Hay una publicación larga de Jeremy Cole sobre el tema).
Una relación de uno a muchos no necesita esta tabla adicional. En su lugar, tenga una identificación dentro de la otra tabla. Por ejemplo, una tabla de ciudad tendrá la identificación del país.