Cita: Es correcto trabajar de esa forma? osea con 2 llaves primarias en una tabla, he leido que solo deberia haber 1 sola llave primaria por cada tabla
No confundas una PK de doble campo con dos PK. Eso no existe y simplemente el DBMS no te dejaría crear una PK cuando hay otra ya definida. Por ese lado no te procupes.
Acuérdate la definición básica:
Una clave primaria es un campo
o conjunto de campos que identifica unívocamente un registro en una tabla.
Esto significa que si en una tabla un sólo campo no tiene la unicidad suficiente para ser PK, se debe buscar cuál combinación de campos sí lo posee,
antes de ponerse a crearle un campo adicional para ello (esto ultimo se les escapa a muchos por fiaca, y porque sólo se estudia en profundidad en cursos universitarios).
En el contexto de tu diseño,
category_lang es una
relación con atributos dentro del DER lógico, por lo que corresponde que exista como tabla y su PK debe ser la combinación de PKs de las tablas relacionadas. No lleva ningún otro atributo como PK adicional (podría perfectamente ser una PK de triple campo), porque esa relación no es iterable en cada par relacionado.
¿Se entiende?
Resumen:
El diseño está OK.
Dos tips:
1) No abuses de los VARCHAR. No siempre es necesario ponerle a un varchar la longitud máxima posible, ya que la longitud debe ser la que se espera como máxima del dato.
Los campos no se dimensionan arbitrariamente. Para darte otro ejemplo: Si voy a guardar las velocidades alcanzadas por un auto, ¿para que voy a usar SMALLINT UNSIGNED (0 a 65535) si con un TINYINT UNSIGNED (0 a 255) me sobra?...
2) Los varchar, pese a lo que digan algunos manuales viejos, no tiene un límite de 255 caracteres, sino de 65535, a partir del MySQL 5.0.3, o sea, hace más de tres años. Aprovéchalos.