En el diseño conceptual se puede expresar con en la imagen anterior pero cuando se va a programar se genera una tablan intermedia o también se coloca en el diseño físico.
Diseño Físico
Llaves naturales
CREATETABLEfactura ( numero_factura int4 NOT NULL, anio int4 NOT NULL, forma_pago varchar(100) NOT NULL, total float8 NOT NULL, PRIMARY KEY (numero_factura, anio));CREATETABLEproducto ( codigo_barras varchar(255) NOT NULL, nombre_producto varchar(255) NOT NULL, precio float8 NOT NULL, cantidad int4 NOT NULL, PRIMARY KEY (codigo_barras));CREATETABLEdetalle_factura ( numero_factura int4 NOT NULL, anio_factura int4 NOT NULL, codigo_barras varchar(255) NOT NULL, precio float8 NOT NULL, cantidad int4 NOT NULL, PRIMARY KEY (numero_factura, anio_factura, codigo_barras));ALTER TABLE detalle_factura ADD CONSTRAINT fk_factura FOREIGN KEY (numero_factura, anio_factura) REFERENCES factura (numero_factura, anio);
ALTERTABLE detalle_factura ADDCONSTRAINT fk_producto FOREIGN KEY (codigo_barras) REFERENCES producto (codigo_barras);
Llaves sustitutas
CREATETABLEfactura ( id SERIALNOT NULL, numero_factura int4 NOT NULL, anio int4 NOT NULL, forma_pago varchar(100) NOT NULL, total float8 NOT NULL, PRIMARY KEY (id), CONSTRAINT uc_factura UNIQUE (numero_factura, anio));CREATETABLEproducto ( id SERIALNOT NULL, codigo_barras varchar(255) NOT NULL, nombre_producto varchar(255) NOT NULL, precio float8 NOT NULL, cantidad int4 NOT NULL, PRIMARY KEY (id), CONSTRAINT uc_producto UNIQUE (codigo_barras));CREATETABLEdetalle_factura ( id SERIALNOT NULL, id_factura int4 NOT NULL, id_producto int4 NOT NULL, cantidad int4 NOT NULL, precio float8 NOT NULL, PRIMARY KEY (id), CONSTRAINT uc_detalle_factura UNIQUE (id_factura, id_producto));