Supongamos que queremos crear una base de datos para una tienda en línea que vende productos. Primero, debemos identificar las entidades relevantes para nuestra base de datos.
Aquí te presento un ejemplo de creación y diseño de una base de datos utilizando las tablas tb_cliente, tb_producto, tb_factura y tb_factura_detalle.
En Oracle se pueden crear bases de datos y cada base de datos puede contener uno o varios esquemas, en la base de datos XE vamos a crear un usuario "BDCRUD" con contraseña "123456".
--CREAR USUARIO
ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE;
CREATE USER BDCRUD IDENTIFIED BY 123456;
GRANT ALL PRIVILEGES TO BDCRUD;
En Oracle, un esquema es un conjunto de objetos de base de datos (tablas, vistas, índices, etc.) que están relacionados entre sí y pertenecen a un usuario específico. Un esquema se puede entender como la estructura de la base de datos de un usuario.
En Oracle, un usuario es una entidad de seguridad que tiene permisos para conectarse a la base de datos y realizar operaciones en ella. Cada usuario puede tener un esquema asociado, que es el conjunto de objetos de base de datos que le pertenecen.
Tabla "tb_cliente"
La tabla "tb_cliente" contiene información sobre los clientes de la tienda, incluyendo su nombre, dirección y fecha de nacimiento.
-- Create table
create table BDCRUD.TB_CLIENTE
(
idcliente INTEGER not null,
nombres VARCHAR2(100) not null,
direccion VARCHAR2(100),
fecha_nacimiento DATE not null,
fecha_registro DATE not null
);
-- Create/Recreate primary, unique and foreign key constraints
alter table BDCRUD.TB_CLIENTE
add constraint TB_CLIENTE_PK primary key (IDCLIENTE);
Creamos la secuencia para el campo "idcliente" de la tabla "tb_cliente"
-- Create sequence
create sequence BDCRUD.SQ_TB_CLIENTE
minvalue 20
maxvalue 9999999999999999999999999999
start with 0
increment by 1
nocache;
Script para insertar datos a la tabla "tb_cliente"
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (1, 'Juan Perez', 'Av. Siempreviva 123', to_date('15-06-1990', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (2, 'Maria Rodriguez', 'Calle Falsa 123', to_date('20-08-1985', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (3, 'Pedro Gomez', 'Av. Principal 456', to_date('10-02-1995', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (4, 'Ana Fernandez', 'Calle Real 789', to_date('01-12-1982', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (5, 'Luisa Martinez', 'Av. America 321', to_date('18-07-1993', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (6, 'Jorge Ramirez', 'Calle Luna 456', to_date('30-11-1978', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (7, 'Sofia Sanchez', 'Av. Sol 987', to_date('05-04-1998', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (8, 'Carlos Torres', 'Calle Estrella 654', to_date('22-03-1987', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (9, 'Fernando Garcia', 'Av. Universitaria 321', to_date('28-09-1991', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (10, 'Gloria Castro', 'Calle Alegria 987', to_date('12-05-1975', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (11, 'Diego Lopez', 'Av. Libertad 456', to_date('02-08-1996', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (12, 'Valeria Jimenez', 'Calle Flores 789', to_date('07-01-1989', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (13, 'Ricardo Hernandez', 'Av. Rio 123', to_date('25-10-1979', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (14, 'Silvia Morales', 'Calle Montaña 456', to_date('12-03-1992', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (15, 'Gabriel Diaz', 'Av. Peru 987', to_date('22-06-1984', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (16, 'Lucia Ortiz', 'Calle Paraiso 654', to_date('08-09-1976', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (17, 'Oscar Nieto', 'Av. España 321', to_date('15-12-1990', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (18, 'Alicia Rivera', 'Calle Paz 789', to_date('28-05-1983', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (19, 'Pablo Castro', 'Av. Amazonas 456', to_date('03-02-1994', 'dd-mm-yyyy'), sysdate);
insert into BDCRUD.TB_CLIENTE (IDCLIENTE, NOMBRES, DIRECCION, FECHA_NACIMIENTO, FECHA_REGISTRO)
values (20, 'Natalia Vega', 'Calle Luna 123', to_date('17-11-1977', 'dd-mm-yyyy'), sysdate);
commit;
Tabla "tb_producto"
La tabla "tb_producto" contiene información sobre los productos que vende la tienda, incluyendo su nombre, precio y stock.
-- Create table
create table BDCRUD.TB_PRODUCTO
(
idproducto INTEGER not null,
nombre VARCHAR2(100) not null,
precio NUMBER(10,2) not null,
stock NUMBER(10,2) not null,
fecha_registro DATE not null
);
-- Create/Recreate primary, unique and foreign key constraints
alter table BDCRUD.TB_PRODUCTO
add constraint TB_PRODUCTO_PK primary key (IDPRODUCTO);
Creamos la secuencia para el campo "idproducto" de la tabla "sq_tb_producto"
-- Create sequence
create sequence BDCRUD.SQ_TB_PRODUCTO
minvalue 17
maxvalue 9999999999999999999999999999
start with 0
increment by 1
nocache;
Script para insertar datos a la tabla "tb_producto"
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (1, 'Smartphone Samsung Galaxy S20', 899.99, 10.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (2, 'Laptop Dell Inspiron 15', 1099.99, 5.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (3, 'Smart TV LG 55"', 1299.99, 3.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (4, 'Aspiradora Dyson V11', 599.99, 2.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (5, 'Camisa Polo Ralph Lauren', 99.99, 20.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (6, 'Tenis Nike Air Max', 149.99, 8.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (7, 'Muñeca Barbie Dreamhouse', 199.99, 4.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (8, 'Camisa', 39.99, 50.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (9, 'Pantalón', 59.99, 30.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (10, 'Zapatos', 89.99, 20.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (11, 'Gorra', 19.99, 100.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (12, 'Bufanda', 29.99, 40.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (13, 'Guantes', 14.99, 50.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (14, 'Chaqueta', 99.99, 10.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (15, 'Calcetines', 9.99, 80.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (16, 'Sombrero', 24.99, 30.00, sysdate);
insert into BDCRUD.TB_PRODUCTO (IDPRODUCTO, NOMBRE, PRECIO, STOCK, FECHA_REGISTRO)
values (17, 'Cinturón', 19.99, 60.00, sysdate);
commit;
Tabla "tb_factura"
La tabla "tb_factura" relaciona los clientes con las facturas que han realizado y contiene información sobre la fecha y el total(monto) de la factura
-- Create table
create table BDCRUD.TB_FACTURA
(
idfactura INTEGER not null,
id_cliente INTEGER not null,
nro_factura VARCHAR2(10) not null,
monto NUMBER(10,2) not null,
fecha_registro DATE not null
);
-- Create/Recreate primary, unique and foreign key constraints
alter table BDCRUD.TB_FACTURA
add constraint TB_FACTURA_PK primary key (IDFACTURA);
alter table BDCRUD.TB_FACTURA
add constraint FK_TB_CLIENTE foreign key (ID_CLIENTE)
references BDCRUD.TB_CLIENTE (IDCLIENTE);
Creamos la secuencia para el campo "idfactura" de la tabla "sq_tb_factura"
-- Create sequence
create sequence BDCRUD.SQ_TB_FACTURA
minvalue 10
maxvalue 9999999999999999999999999999
start with 0
increment by 1
nocache;
Script para insertar datos a la tabla "tb_factura"
insert into BDCRUD.TB_FACTURA (IDFACTURA, ID_CLIENTE, NRO_FACTURA, MONTO, FECHA_REGISTRO)
values (1, 1, 'FAC001', 100.00, sysdate);
insert into BDCRUD.TB_FACTURA (IDFACTURA, ID_CLIENTE, NRO_FACTURA, MONTO, FECHA_REGISTRO)
values (2, 2, 'FAC002', 200.00, sysdate);
insert into BDCRUD.TB_FACTURA (IDFACTURA, ID_CLIENTE, NRO_FACTURA, MONTO, FECHA_REGISTRO)
values (3, 3, 'FAC003', 300.00, sysdate);
insert into BDCRUD.TB_FACTURA (IDFACTURA, ID_CLIENTE, NRO_FACTURA, MONTO, FECHA_REGISTRO)
values (4, 4, 'FAC004', 400.00, sysdate);
insert into BDCRUD.TB_FACTURA (IDFACTURA, ID_CLIENTE, NRO_FACTURA, MONTO, FECHA_REGISTRO)
values (5, 5, 'FAC005', 500.00, sysdate);
insert into BDCRUD.TB_FACTURA (IDFACTURA, ID_CLIENTE, NRO_FACTURA, MONTO, FECHA_REGISTRO)
values (6, 1, 'FAC006', 150.00, sysdate);
insert into BDCRUD.TB_FACTURA (IDFACTURA, ID_CLIENTE, NRO_FACTURA, MONTO, FECHA_REGISTRO)
values (7, 2, 'FAC007', 250.00, sysdate);
insert into BDCRUD.TB_FACTURA (IDFACTURA, ID_CLIENTE, NRO_FACTURA, MONTO, FECHA_REGISTRO)
values (8, 3, 'FAC008', 350.00, sysdate);
insert into BDCRUD.TB_FACTURA (IDFACTURA, ID_CLIENTE, NRO_FACTURA, MONTO, FECHA_REGISTRO)
values (9, 4, 'FAC009', 450.00, sysdate);
insert into BDCRUD.TB_FACTURA (IDFACTURA, ID_CLIENTE, NRO_FACTURA, MONTO, FECHA_REGISTRO)
values (10, 5, 'FAC010', 550.00, sysdate);
commit;
Tabla "tb_factura_detalle"
La tabla "tb_factura_detalle" contiene información sobre los productos que se incluyen en cada factura y la cantidad y precio de cada producto.
-- Create table
create table BDCRUD.TB_FACTURA_DETALLE
(
iddetallefactura INTEGER not null,
id_factura INTEGER not null,
id_producto INTEGER not null,
cantidad INTEGER not null,
precio NUMBER(10,2) not null,
subtotal NUMBER(10,2) not null,
fecha_registro DATE not null
);
-- Create/Recreate primary, unique and foreign key constraints
alter table BDCRUD.TB_FACTURA_DETALLE
add constraint TB_FACTURA_DETALLE_PK primary key (IDDETALLEFACTURA);
alter table BDCRUD.TB_FACTURA_DETALLE
add constraint FK_TB_FACTURA foreign key (ID_FACTURA)
references BDCRUD.TB_FACTURA (IDFACTURA);
alter table BDCRUD.TB_FACTURA_DETALLE
add constraint FK_TB_PRODUCTO foreign key (ID_PRODUCTO)
references BDCRUD.TB_PRODUCTO (IDPRODUCTO);
Creamos la secuencia para el campo "iddetallefactura" de la tabla "sq_tb_factura_detalle"
-- Create sequence
create sequence BDCRUD.SQ_TB_FACTURA_DETALLE
minvalue 20
maxvalue 9999999999999999999999999999
start with 0
increment by 1
nocache;
Script para insertar datos a la tabla "tb_factura_detalle"
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (1, 1, 1, 2, 25.00, 50.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (2, 1, 2, 1, 50.00, 50.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (3, 2, 3, 3, 20.00, 60.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (4, 2, 4, 2, 35.00, 70.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (5, 3, 5, 4, 15.00, 60.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (6, 3, 6, 1, 100.00, 100.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (7, 4, 7, 3, 30.00, 90.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (8, 4, 8, 2, 45.00, 90.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (9, 5, 9, 5, 10.00, 50.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (10, 5, 10, 2, 75.00, 150.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (11, 6, 1, 1, 25.00, 25.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (12, 6, 4, 3, 35.00, 105.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (13, 7, 6, 2, 100.00, 200.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (14, 7, 9, 1, 10.00, 10.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (15, 8, 2, 2, 50.00, 100.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (16, 8, 3, 1, 20.00, 20.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (17, 9, 5, 3, 15.00, 45.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (18, 9, 8, 4, 45.00, 180.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (19, 10, 10, 1, 75.00, 75.00, sysdate);
insert into BDCRUD.TB_FACTURA_DETALLE (IDDETALLEFACTURA, ID_FACTURA, ID_PRODUCTO, CANTIDAD, PRECIO, SUBTOTAL, FECHA_REGISTRO)
values (20, 10, 7, 2, 30.00, 60.00, sysdate);
commit;
Diseño del esquema "bdcrud"
Con este diseño de base de datos, podemos almacenar y recuperar información de manera eficiente sobre los clientes que realizan compras, los productos que vendemos, las facturas que generamos y los detalles de cada factura. Además, podemos realizar consultas y generar informes útiles para la gestión de la tienda.
Para visualizar el diseño completo de las tablas creadas utilizando el modelo lógico, lo ideal es utilizar una herramienta de modelado de datos que te permita crear y visualizar diagramas ER (Entidad-Relación) que representen la estructura de la base de datos y las relaciones entre las tablas.
