¡Hola! Me parece que andas usando un bloqueador de anuncios =( ¿Nos desbloqueas? ¿Por qué?
F13

Funcion 13

Localizador de tiendas con PHP, jQuery Mobile y MySQL - Parte 1

Esta es la primera de tres partes de una serie de tutoriales sobre una aplicación completa usando PHP, jQuery Mobile, MySQL y Google Maps en el que podremos localizar establecimientos.

La idea es sencilla, tenemos varios establecimientos esparcidos por la geografía Española por lo que ofrecemos un listado de provincias, este carga un listado de poblaciones y finalmente ubicamos las tiendas disponibles en esa población o bien intentamos que nos localice tiendas cercanas a nuestra ubicación.

Dado que es una aplicación larga, vamos a dividirla por partes para no liarnos demasiado. En cada parte tocaremos un punto y seguiremos el orden que considero más lógico para crear una aplicación:

  1. Planear y crear la base de datos
  2. Desarrollar el backend con PHP que devolverá los datos a jQuery Mobile a través de JSON.
  3. Desarrollar la parte frontal con jQuery Mobile y Google Maps

Echa un vistazo a lo que vamos a desarrollar:

¡Comencemos!

¿Cuántas tablas necesito?

En nuestro caso vamos a usar 4 tablas. Veámoslas rápidamente:

  • Provincias: En esta tabla almacenaremos las provincias en las que tengamos presencia. Más tarde estructuraremos las consultas de manera que no veamos la provincia a no ser que tengamos una tienda en ella, por si queremos cargarlas todas.
  • Poblaciones: En esta tabla almacenaremos las poblaciones. Además del nombre de la población, tendremos un campo que la relacionará con la tabla de provincias.
  • Tipos: Esta tabla no es necesaria, pero nos sirve para almacenar el tipo de establecimiento que estemos guardando. Imaginad que hacemos una aplicación para una cadena hotelera y queremos diferenciar los hoteles de los resorts y de los paradores.
  • Tiendas: Sin duda la tabla más obvia. Aquí almacenaremos toda la información sobre la tienda como el nombre, la dirección, las coordenadas, etc. Además tendremos un campo que la relacione con poblaciones y otro que la relacione con tipos.

Así pues, tenemos que las relaciones son las siguientes:

  • Una provincia puede tener varias poblaciones.
  • Una población puede tener varios establecimientos.
  • Un tipo de establecimiento puede pertenecer a varios de éstos.

Como véis, todas las relaciones son 1-n por lo que, por suerte, no necesitaremos ninguna tabla intermedia para almacenar únicamente relaciones.

Aquí podéis ver rápidamente el mapa:

El código

Aquí os dejo el código necesario para crear las tablas. Visto el esquema, tampoco tiene mucho misterio. Igualmente, podéis descargarlo en un archivo .sql un poco más abajo:

-- -----------------------------------------------------
-- Table `default_schema`.`provincias`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `default_schema`.`provincias` (  
  `id` INT(11) NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(50) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB  
AUTO_INCREMENT = 1  
DEFAULT CHARACTER SET = utf8;

-- -----------------------------------------------------
-- Table `default_schema`.`poblaciones`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `default_schema`.`poblaciones` (  
  `id` INT(11) NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(50) NOT NULL ,
  `provincia` INT(11) NOT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `provincia` (`provincia` ASC) ,
  CONSTRAINT `ciudades_ibfk_1`
    FOREIGN KEY (`provincia` )
    REFERENCES `default_schema`.`provincias` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB  
AUTO_INCREMENT = 1  
DEFAULT CHARACTER SET = utf8;

-- -----------------------------------------------------
-- Table `default_schema`.`tipos`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `default_schema`.`tipos` (  
  `id` INT(11) NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(50) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB  
AUTO_INCREMENT = 1  
DEFAULT CHARACTER SET = utf8;

-- -----------------------------------------------------
-- Table `default_schema`.`tiendas`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `default_schema`.`tiendas` (  
  `id` INT(11) NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(56) NOT NULL ,
  `tipo` INT(11) NULL DEFAULT NULL ,
  `direccion` VARCHAR(100) NOT NULL ,
  `cp` VARCHAR(5) NOT NULL ,
  `ciudad` INT(11) NOT NULL ,
  `lat` VARCHAR(12) NOT NULL ,
  `lng` VARCHAR(12) NOT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `tipo` (`tipo` ASC) ,
  INDEX `ciudad` (`ciudad` ASC) ,
  CONSTRAINT `tiendas_ibfk_1`
    FOREIGN KEY (`ciudad` )
    REFERENCES `default_schema`.`poblaciones` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `tiendas_ibfk_2`
    FOREIGN KEY (`tipo` )
    REFERENCES `default_schema`.`tipos` (`id` )
    ON DELETE SET NULL
    ON UPDATE SET NULL)
ENGINE = InnoDB  
AUTO_INCREMENT = 1  
DEFAULT CHARACTER SET = utf8;  

Pues hasta aquí llega esta primera parte que, sin duda, es la más corta de las 3. Ya puedes disfrutar de la siguiente parte, en la que explicamos cómo crear la estructura PHP.

Si el artículo te pareció interesante, útil o incluso equivocado, por favor considera el dejar un comentario. ¡Lo apreciaré mucho!

Programador Front-end en First + Third y Potato. Trabajando con JavaScript y HTML5 desde el corazón de Sevilla.

Comentarios ¡Únete a la conversación!