Schéma complet de la base

Stratégie "une seule table par arborescence d'héritage"

create table article1 (
  reference varchar(8) constraint pk_article1 primary key,
  type_article varchar(15),
  -- pour les articles qui ne sont pas des lots (stylos, ramettes,...)
  description varchar(80),
  pu decimal(10, 2),
  -- pour les stylos
  couleur varchar(15),
  -- pour les ramettes
  grammage integer,
  -- pour les lots ; type decimal(4,2) si nombre décimal
  pourcentage integer)
  
-- Composition d'un lot
-- Clé primaire possible : (ref_article, ref_lot)
create table lot_article1 (
  ref_article varchar(8) constraint fk_lot_article1_article references article1,
  ref_lot varchar(8) constraint fk_lot_article_lot references article1,
  nb int_article)

create table facture1 (
  numero integer constraint pk_facture1 primary key,
  nom_client varchar(80),
  date_facture date)

create table ligne1 (
  num_facture integer 
    constraint fk_ligne1_facture1 references facture1 on delete cascade,
  ref_article varchar(8) constraint fk_ligne1_article1 references article1,
  quantite integer, 
  constraint pk_ligne1 primary key(num_facture, ref_article))

Stratégie "une table par classe concrète"

create table stylo2 (
  reference varchar(8) constraint pk_stylo2 primary key,
  description varchar(80),
  pu decimal(10, 2),
  couleur varchar(15))

create table ramette2 (
  reference varchar(8) constraint pk_ramette2 primary key,
  description varchar(80),
  pu decimal(10, 2),
  grammage integer)

create table lot2 (
  reference varchar(8) constraint pk_lot2 primary key,
  pourcentage integer)
  
-- Composition d'un lot
-- Le problème principal de cette méthode de mapping : pas possible de traduire
-- convenablement une référence vers une classe abstraite
-- (ici une référence vers un article).
-- Clé primaire possible : (ref_article, ref_lot)
-- Il est envisageable d'ajouter une colonne donnant le type des articles qui composent le lot.
create table lot_article2 (
  -- pas possible de mettre une contrainte "foreign key" sur ref_article !
  ref_article varchar(8),
  ref_lot varchar(8) constraint fk_lot_article2_lot2 references lot2,
  nb_article integer)

create table facture2 (
  numero integer constraint pk_facture2 primary key,
  client varchar(50),
  date_facture date)

create table ligne2 (
  num_facture integer 
    constraint fk_ligne2_facture2 references facture2 on delete cascade,
  -- pas possible de mettre une contrainte "foreign key" sur ref_article !
  ref_article varchar(8),
  quantite integer,
  constraint pk_ligne2 primary key(num_facture, ref_article))

Stratégie "une table par classe"

Remarque : on peut aussi ajouter "type_article varchar(15)" à la table article3.

create table article3 (
   reference varchar(8) constraint pk_article3 primary key)

create table article_unitaire3 (
   reference varchar(8) constraint pk_article_unitaire3 primary key 
     constraint fk_article_unitaire3_article3 references article3,
   description varchar(80),
   pu decimal(10, 2))

create table stylo3 (
   reference varchar(8) constraint pk_stylo3 primary key 
     constraint fk_stylo3_article3 references article3,
   couleur varchar(15))

create table ramette3 (
   reference varchar(8) constraint pk_ramette3 primary key 
     constraint fk_ramette3_article3 references article3,
   grammage integer)

create table lot3 (
   reference varchar(8) constraint pk_lot3 primary key 
     constraint fk_lot3_article3 references article3,
   pourcentage integer)
   
-- Composition d'un lot
create table lot_article3 (
  ref_article varchar(8) constraint fk_lot_article3_article3 references article3,
  ref_lot varchar(8) constraint fk_lot_article3_lot3 references lot3,
  nb int_article,
  constraint pk_lot_article3 primary key(ref_article, ref_lot))

create table facture3 (
   numero integer constraint pk_facture3 primary key,
   client varchar(50),
   date_facture date)

create table ligne3 (
   num_facture integer constraint fk_ligne3_facture3 references facture3 on delete cascade,
   ref_article varchar(8) constraint fk_ligne3_article3 references article3,
   quantite integer,
   constraint pk_ligne3 primary key(num_facture, ref_article))