entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Diseño base de datos para concurso de fotografía

Quiero realizar una web para un concurso de fotografía donde se requiere que los usuarios puedan subir hasta un máximo de 3 imágenes. Los usuarios pueden participar en 3 categorías diferentes. La categoría General, categoría para alumnos y categoría para los padres de los alumnos. De manera que en la general puede participar cualquiera, pero si alguien participa en la categoría de alumnos y en la categoría de padres de alumnos participa directamente en la categoría general.

En un principio cree un sistema para organizar las imágenes por carpetas, de manera que se creaba una carpeta por categoría (general, alumnos, padres) y dentro de cada una de estas carpetas otra carpeta cuyo nombre iba a ser apellidos_nombre y que almacenaría las imágenes de cada usuario. El problema de este sistema es que al poder participar cada usuario en mas de una categoría me obligaría a tener una duplicidad en las imágenes que no quiero tener. Por ello al final me he decidido a crear una base de datos que almacenaría los datos de los usuarios, las url de las imágenes que suben, y las categorías en las que participan. Como no estoy muy puesto en bases de datos me gustaría preguntaros si está bien lo que he diseñado hasta ahora. Esta son las tablas de la base de datos:

CREATE TABLE usuarios(
    user_id integer not null UNIQUE AUTO_INCREMENT ,
    nombre varchar(20) not null,
    apellidos varchar(50) not null,
    email varchar(100) not null UNIQUE,
    telefono int
);

CREATE TABLE imagenes(
    image_id integer not null UNIQUE AUTO_INCREMENT,
    PRIMARY KEY(image_id),
    mime_type varchar(20) not null,
    url varchar(100) not null UNIQUE,
    nombre varchar(100) not null,
    localizacion varchar(100) not null,
    user_id int not null
    FOREIGN KEY(user_id) 
        REFERENCES usuarios(user_id)
        ON DELETE CASCADE,
    categoria varchar(20) not null REFERENCES categorias(nombre)
);

CREATE TABLE categorias(
    categoria_id integer not null UNIQUE AUTO_INCREMENT,
    PRIMARY KEY(categoria_id),
    nombre varchar(20) not null

);

CREATE TABLE usuario_categoria{
    user_id integer not null, 
    FOREIGN KEY(user_id)
        REFERENCES usuarios(user_id)
        ON DELETE CASCADE,
    categoria_id not null,
    FOREIGN KEY(categoria_id) 
        REFERENCES categorias(usuario_categoria)
};

CREATE TABLE imagenes_categoria{
    image_id integer not null,
    FOREIGN KEY(image_id) 
        REFERENCES imagenes(image_id)
        ON DELETE CASCADE,
    categoria_id integer not null,
    FOREIGN KEY(categoria_id) 
        REFERENCES categorias(categoria_id)
}

La tabla usuarios almacena los datos de los participantes, la tabla imágenes almacena la dirección donde está almacenada y categorías almacena las diferentes categorías.. Y el resto son tablas intermedias. usuario_categoria muestra que usuarios participan en que categoría. Y por ultimo imágenes_categoria nos indica que imágenes pertenecen a cada categoría.

Me gustaría saber vuestra opinión, críticas, posibles soluciones mejores y mas eficientes. Lo que sea. Un saludo

1 Respuesta

3votos

Leonardo-Tadei Puntos227320

Hola Javier,

Lo único que podría agregarse es que las tablas usuario_categoria e imagenes_categoria tengan además un ID único autoincremental, para que el acceso unívoca a todos los datos sea por una clave simple en vez de por una clave doble.

Esto simplificará mucho que por ejemplo una imagen o usuario cambie de categoría.

Hay una cosa del enunciado del problema que no me queda claro y podría significar cambios en la normalización: decís que un usuario puede participar en más de una categoría. Si la categoría es relativa al usuario, por qué las imágenes también tienen categoría?

Saludos!

0voto

javiermadueno comentado

Efectivamente me he dado cuenta de que una de las dos tablas (usuario_categoria o a imagenen_categoria) sobra porque se obtiene información redundante. Si por ejemplo solo utilizase la tabla imagenen_categoria podría obtener también que usuarios participan en una categoría a traves de la tabla imagenes no?

0voto

Leonardo-Tadei comentado

Javier,

Yo creo que para este problema, ateniéndome a tu descripción, los que tienen categorías son los Usuarios, y no las imágenes que ellos publican, que pertenecen al usuario.

Sería distinto si un Usuario pudiera elegir en qué categoría publicar cada una de las 3 fotos posibles.

Si la elección de la categoría es referente al Usuario y no a las Imágenes, en ese caso la tabla Imágenes-Categoría es la que no tiene sentido. Luego, podés determinar al mostar imágenes a qué Categoría pertenecen relacionándoles con el Usuario.

Saludos cordiales.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta