Bolo Palma – Aplicación para control de competiciones deportivas – Parte 3

Definimos modelos: temporadas, modalidades, categorías,…

Continuamos metiéndonos en el charco. Como ya habíamos dejado claro en el post anterior, es necesario crear una serie de objetos que representen las temporadas, modalidades, categorías, circuitos, competiciones, etcétera. Después de darle unas cuantas vueltas al asunto, creo que va a quedar definido de la siguiente manera:

  • Temporada: su nombre es suficientemente descriptivo. Para cada temporada habrá distintas categorías, circuitos, competiciones…
  • Modalidad: que hará referencia a las distintas modalidades que se engloban en la federación. En el caso concreto de los bolos en Cantabria, tenemos cuatro modalidades : Bolo Palma, Pasabolo Tablón, Pasabolo Losa y Bolo Pasiego. Cada uno de ellas podrá tener diferentes categorías, circuitos y competiciones.
  • Categoría: hace referencia a las distintas maneras de clasificar a los participantes, ya sea según su calidad (1ª, 2ª,3ª), según su edad (Veteranos, Juveniles, Cadetes, Infantiles, Alevines y Benjamines) o según el género (Categoría Femenina). Cada una de estas categorías podrá tener sus distintos circuitos y competiciones, que a su vez, también dependerán de la modalidad y la temporada.
  • Circuito: Creado en función de la temporada, modalidad y categoría. Será el encargado de dar cabida a las distintas competiciones que integrarán estos circuitos.
  • Competiciones:  Además de tener que pertenecer a un solo circuito, van a depender también de una única temporada, modalidad y Categoría.

Y como una imagen vale mucho más que mil palabras, aquí tenemos un diseño más gráfico de todo este rollo que he soltado:

Y, como esto es un blog que, entre otras muchas cosas, trata sobre programación y código, vamos a ver como hemos modelado todo esto en términos de Sequelize y NodeJs. Os dejo las definiciones de cada una de las entidades:

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('Temporada', {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    nombre: {
      type: DataTypes.TEXT,
      allowNull: false,
      unique:{
                msg: 'Ya existe una temporada con ese nombre'
              }
    },
    descripcion: {
      type: DataTypes.TEXT,
      allowNull: true
    }
  }, {
    tableName: 'temporadas'
  });
};
module.exports = function(sequelize, DataTypes) {
  return sequelize.define('Modalidad', {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement:true
    },
    nombre: {
      type: DataTypes.TEXT,
      allowNull: false,
      unique:{
        msg:'Ya existe una modalidad con ese nombre'
      }
    },
    descripcion: {
      type: DataTypes.TEXT,
      allowNull: true
    }
  }, {
    tableName: 'modalidades',
    name: {
      singular: 'Modalidad',
      plural: 'Modalidades'
    }
  });
};
module.exports = function(sequelize, DataTypes) {
  return sequelize.define('Categoria', {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
    },
    modalidad: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'Modalidades',
        key: 'id'
      }
    },
    nombre: {
      type: DataTypes.TEXT,
      allowNull: false
    },
    descripcion: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    temporada: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'Temporadas',
        key: 'id'
      }
    }
  }, {
    tableName: 'categorias',
    name: {
      singular: 'Categoria',
      plural: 'Categorias'
    }
  });
};
module.exports = function(sequelize, DataTypes) {
  return sequelize.define('Circuito', {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement:true
    },
    modalidad: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'Modalidades',
        key: 'id'
      }
    },
    categoria: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'Categorias',
        key: 'id'
      }
    },
    nombre: {
      type: DataTypes.TEXT,
      allowNull: false
    },
    descripcion: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    puntuables: {
      type: DataTypes.INTEGER,
      allowNull: false
    },
    temporada: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'Temporadas',
        key: 'id'
      }
    }
  }, {
    tableName: 'circuitos',
    name: {
      singular: 'Circuito',
      plural: 'Circuitos'
    }
  });
};
module.exports = function(sequelize, DataTypes) {
  return sequelize.define('Competicion', {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true
    },
    circuito: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'Circuitos',
        key: 'id'
      }
    },
    temporada: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'Temporadas',
        key: 'id'
      }
    },
    modalidad: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'Modalidades',
        key: 'id'
      }
    },
    categoria: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'Categorias',
        key: 'id'
      }
    },
    nombre: {
      type: DataTypes.TEXT,
      allowNull: false
    },
    descripcion: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    bolera: {
      type: DataTypes.TEXT,
      allowNull: false
    },
    organizacion: {
      type: DataTypes.TEXT,
      allowNull: false
    },
    telefono1: {
      type: DataTypes.TEXT,
      allowNull: false
    },
    telefono2: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    horario1: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    horario2: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    diastiradas: {
      type: DataTypes.TEXT,
      allowNull: false
    },
    fechafinal: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    sistemafinal: {
      type: DataTypes.TEXT,
      allowNull: false
    },
    clasificados: {
      type: DataTypes.INTEGER,
      allowNull: false
    }
  }, {
    tableName: 'competiciones',
    name: {
      singular: 'Competicion',
      plural: 'Competiciones'
    }
  });
};

Y aquí os dejo como he definido las distintas asociaciones entre los modelos:

var Temporada = sequelize.import(path.join(__dirname, 'temporadas'));
var Modalidad = sequelize.import(path.join(__dirname, 'modalidades'));
var Categoria = sequelize.import(path.join(__dirname, 'categorias'));
var Circuito = sequelize.import(path.join(__dirname, 'circuitos'));
var Organizacion = sequelize.import(path.join(__dirname, 'organizaciones'));
var Jugador = sequelize.import(path.join(__dirname, 'jugadores'));
var Competicion = sequelize.import(path.join(__dirname, 'competiciones'));

Temporada.hasMany(Circuito, {
  foreignKey: 'temporada'
});
Circuito.belongsTo(Temporada, {
  foreignKey: 'temporada'
});
Temporada.hasMany(Categoria,{
  foreignKey:'temporada'
});
Categoria.belongsTo(Temporada,{
  foreignKey:'temporada'
});
Modalidad.hasMany(Circuito, {
  foreignKey: 'modalidad'
});
Circuito.belongsTo(Modalidad, {
  foreignKey: 'modalidad'
});
Modalidad.hasMany(Categoria, {
  foreignKey: 'modalidad'
});
Categoria.belongsTo(Modalidad, {
  foreignKey: 'modalidad'
});

Categoria.hasMany(Circuito, {
  foreignKey: 'categoria'
});
Circuito.belongsTo(Categoria, {
  foreignKey: 'categoria'
});
Circuito.hasMany(Competicion, {
  foreignKey: 'circuito'
});
Competicion.belongsTo(Circuito, {
  foreignKey: 'circuito'
});
Temporada.hasMany(Competicion, {
  foreignKey: 'temporada'
});
Competicion.belongsTo(Temporada, {
  foreignKey: 'temporada'
});
Modalidad.hasMany(Competicion, {
  foreignKey: 'modalidad'
});
Competicion.belongsTo(Modalidad, {
  foreignKey: 'modalidad'
});
Categoria.hasMany(Competicion, {
  foreignKey: 'categoria'
});
Competicion.belongsTo(Categoria, {
  foreignKey: 'categoria'
});

En la próxima entrada creo que empezaremos a ver como poner todo esto junto y cómo se pueden ir creando los contenidos de cada una de las entidades que hemos definido.

Rate this post

Pedro Pablo Moral

Licenciado en ADE. Experto Universitario en Gestión de RRHH por competencias-

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.