Secondo me fare un buon lavoro significa fare un qualcosa che sia:

- Riusabile
- Espandibile
- A prova di errore


Premesso ciò, parli di categoria e sottocategoria....io direi di implementare una struttura con categorie annidabili direttamente....ci son due tipi di script su qualche pillola in questo forum...se non vuoi l'estremo delle prestazioni usa la + semplice:

tabella categoria
- id (id univoco, autoincremento)
- idroot (id della categoria madre, se root = '')

tabella categoria_attrib
- id (id univoco, autoincremento)
- idcategoria
- idlang
- titolo
- descrizione
- quello che vuoi

per fare riferimento ad una foto usa sempre l'id categoria...sei sicuro che è univoco ( $id.'.jpg') .. se prevedi sia gif che jpg aggiungi un campo - ext (estensione del file) .. oppure fai un check via script (se esiste il .jpg altrimenti se esiste il .gif altrimenti prendi default.jpg)

Per gli articoli farei invece:

tabella articolo
- id (id univoco, autoincremento)
- idcategoria
- prezzo
- sconto
- e tutti i campi senza testo

tabella articolo_attrib
- id (id univoco, autoincremento)
- idarticolo
- idlang
- titolo
- descrizione
- quello che vuoi

tabella lingua
- id (id univoco, autoincremento)
- titolo


Secondo me è la soluzione migliore perchè:
- Riusabile (si può utilizzare per una struttura qualsiasi di categoria e per un qualsiasi numero di lingue)
- Espandibile (aggiungendo una colonna alla fine di ogni tabella possiamo implementare caratteristiche aggiungendo sia campi testuali che campi fissi per tutte le lingue)
- A prova di errore (i campi fondamentali sulle tabelle articolo e categoria sono univoci, quindi la struttura non ne risente. L'unica perdita potrà essere la mancanza di qualche valore testuale...ma lo script gira cmq e lo aggireremo via php)

Non ho studiato ne database ne programmazione....la logica che uso deriva unicamente da esperienze personali...accetto volentieri consigli e/o critiche...ciaooo