per andare bene lo andra' senz'altro, ma gli attributi di un singolo record annuncio non andrei a suddividerli in altre tabelle.
Le categorie possono essere molte, ma sono in max numero finito ed abbinabili a qualsiasi annuncio. Quindi la tabella puo' vivere di vita propria.
La tabella annunci puo' subire incrementi e decrementi a prescindere dalla categoria, ma sicuramente la foto di quell'annuncio sara' esclusivo attributo di quel record e non degli altri. Quindi perche' sprecare risorse per definire altrove il nome della foto?
La tabella di unione serve per evitare la relazione molti a molti. Ma molti annunci possono avere una relazione molti a uno con categoria. In questo caso non e' possibile che lo stesso oggetto possa appartenere a piu' categorie. Se invece lo stesso oggetto potesse appartenere a piu' categorie allora serve una tabella di unione tra annunci e categoria in modo tale da ripristinare la condizione ottimale di molti a uno.
La situazione molti a molti e' assolutamente da evitare perche' potrebbe rendere ingestibile il database intero. Cioe', ti potrebbe mettere in condizione di non poter estrarre con facilita' i dati che ti servono ed ogni query dovrebbe essere calibrata esattamente per i dati che intendessi evidenziare. Questo sarebbe una assurdita' informatica.