Diseñar una buena base de datos

Iniciado por Meta, 12 Febrero 2011, 04:12 AM

0 Miembros y 1 Visitante están viendo este tema.

Meta

Hola:

Quiero diseñar una base de datos con SQL Server Express 2008 R2 (Gratuito). Se trata de una base de datos para un videoclub. Cosa que hay que dejar clara. Lo quiero hacer desde Visual C# Espress 2010, es como si fuera Case Studio, se puede hacer relaciones, el algo que no tengo muy en cuenta.

Citar- Se alquilan películas en dos formatos, el DVD y el Blu-Ray. Tiene una tabla "Formátos" que dentro de ella puedes agregar si se incluye más formatos como el VHS por poner un ejemplo.
- Tiene una tabla llamada "Clientes", en el se encuentra estos campos.
Código
DNI
Nombre
Apellidos
Dirección
Fecha_Nacimiento
Email
Teléfono1
Teléfono2
Móvil1
Móvil2
Observaciones

- Otra tabla llamada "Películas", en él contiene:
Código
Título
Género
Duración
Copias
Disponibles
Precio
Formato
Año
Actor_principal
Director
Descripción
Notas

- Tabla "Película_que_tiene_el_cliente" (Está relacionado con la tabla "Clientes").
Código
Título
Fecha_de_devolución
Días_de_retraso

- Tabla "Clientes_con_copias_de_estas_películas".

Información:
Tabla "Morosos", campos DNI y nombre.

Tabla "Clientes con deudas", campos DNI, Nombre y Total.

Tabla "Alquiladas", campos código película, Título, Cliente, Devolución.

Tabla "Ingresos", con campor de Concepto, DNI, Cliente, Fecha, Hora, Notas

Complicado de entender y de hacer. ¿Verdad?
Espero que no me falte nada, si tienen ideas antes de hacer un esquema de relaciones aunque sea de gannt o con el CASE Studio, también viene con el Visual C# incluido, no duces en compartirlo por aquí.



Un cordial saludo.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

madpitbull_99

Citar- Tabla "Película_que_tiene_el_cliente" (Está relacionado con la tabla "Clientes").
Yo la llamaría Películas Alquiladas. Tambien debes poner a quien se la alquilas, no?

Citar- Tabla "Clientes_con_copias_de_estas_películas".
No acabo de entender que tipo de información vas a almacenar en esta tabla.

En la tabla Clientes puedes usar como clave primaria tanto el DNI (es único por persona) o usar un ID proprio.


Puedes hacer algo así:



Claramente se puede optimizar/modificar mucho mas, pero al menos puedes hacerte una idea de como hacer las relaciones.

Por si lo quieres, te dejo el script sql para hacer la base de datos como yo lo he hecho.

Código (sql) [Seleccionar]
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `Videoclub` DEFAULT CHARACTER SET utf8 COLLATE utf8_spanish_ci ;
USE `Videoclub` ;

-- -----------------------------------------------------
-- Table `Videoclub`.`clientes`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Videoclub`.`clientes` (
`idcliente` INT NOT NULL AUTO_INCREMENT ,
`DNI` VARCHAR(45) NOT NULL ,
`Nombre` VARCHAR(45) NULL ,
`Apellidos` VARCHAR(45) NULL ,
`Direccion` VARCHAR(45) NULL ,
`Fecha_Nacimiento` VARCHAR(45) NULL ,
`Email` VARCHAR(45) NULL ,
`Tel_Fijo` INT NULL ,
`Tel_Movil` INT NULL ,
`Observaciones` VARCHAR(60) NULL ,
PRIMARY KEY (`idcliente`, `DNI`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Videoclub`.`peliculas_alquiladas`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Videoclub`.`peliculas_alquiladas` (
`idpelicula_alquilada` INT NOT NULL AUTO_INCREMENT ,
`id_pelicula` INT NULL ,
`Titulo` VARCHAR(45) NULL ,
`ClienteID` INT NULL ,
`Fecha_Devolucion` DATETIME NULL ,
`Dias_Retraso` DATETIME NULL ,
`clientes_idcliente` INT NOT NULL ,
`clientes_DNI` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`idpelicula_alquilada`, `clientes_idcliente`, `clientes_DNI`) ,
INDEX `fk_peliculas_alquiladas_clientes1` (`clientes_idcliente` ASC, `clientes_DNI` ASC) ,
CONSTRAINT `fk_peliculas_alquiladas_clientes1`
FOREIGN KEY (`clientes_idcliente` , `clientes_DNI` )
REFERENCES `Videoclub`.`clientes` (`idcliente` , `DNI` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Videoclub`.`peliculas`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Videoclub`.`peliculas` (
`idpelicula` INT NOT NULL ,
`Titulo` VARCHAR(45) NULL ,
`Genero` VARCHAR(45) NULL ,
`Duracion` VARCHAR(45) NULL ,
`Copias` VARCHAR(45) NULL ,
`Disponibles` VARCHAR(45) NULL ,
`Precio` VARCHAR(45) NULL ,
`Formato` INT NULL ,
`año` VARCHAR(45) NULL ,
`Actor_Principal` VARCHAR(45) NULL ,
`Director` VARCHAR(45) NULL ,
`Descripcion` VARCHAR(45) NULL ,
`Notas` VARCHAR(45) NULL ,
`peliculas_alquiladas_idpelicula_alquilada` INT NOT NULL ,
PRIMARY KEY (`idpelicula`, `peliculas_alquiladas_idpelicula_alquilada`) ,
INDEX `fk_peliculas_peliculas_alquiladas1` (`peliculas_alquiladas_idpelicula_alquilada` ASC) ,
CONSTRAINT `fk_peliculas_peliculas_alquiladas1`
FOREIGN KEY (`peliculas_alquiladas_idpelicula_alquilada` )
REFERENCES `Videoclub`.`peliculas_alquiladas` (`idpelicula_alquilada` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Videoclub`.`formatos`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Videoclub`.`formatos` (
`idformato` INT NOT NULL AUTO_INCREMENT ,
`nombre` VARCHAR(45) NULL ,
`peliculas_idpelicula` INT NOT NULL ,
PRIMARY KEY (`idformato`, `peliculas_idpelicula`) ,
INDEX `fk_formatos_peliculas` (`peliculas_idpelicula` ASC) ,
CONSTRAINT `fk_formatos_peliculas`
FOREIGN KEY (`peliculas_idpelicula` )
REFERENCES `Videoclub`.`peliculas` (`idpelicula` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;



Repito, puedes modificar mucho mas la DB.



«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

novalida

madpitbull_99, me podrías decir qué programa has utilizado para hacer la relación entre tablas y la generación del script?

madpitbull_99

Para diseñar bases de datos de forma gráfica se puede hacer hasta con phpMyAdmin (seleccionas tu db y haces clic en la pestaña Diseñador).

En la imagen de arriba he usado MySQLWorkbench. Hay otra bastante buena, llamada DB Designer.



«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

Hadess_inf

Prefiero el DBDESIGNER al MySQLWorkbench ..... este ultimo en un punto tira errores ..