CREATE SCHEMA Genealogie;
SET search_path TO Genealogie, public;
CREATE TABLE Genealogie.Personnes (
  -- Typage des attributs
  Id serial NOT NULL,        -- serial = sequence d'entier 1, 2, 3, ... 
  Nom text NOT NULL,
  Prenom text NOT NULL,
  Sexe char NOT NULL CHECK (Sexe = 'F' or Sexe = 'M'),
  DateNaissance date NOT NULL,
  DateDeces date NOT NULL DEFAULT 'infinity',
  -- Clefs candidates
  PRIMARY KEY (id),
  -- Contraintes d'integrite elementaire
  CHECK (DateNaissance < DateDeces)
);
CREATE TABLE Genealogie.Parents (
  -- Typage des attributs
  Enfant integer NOT NULL,
  Mere integer NOT NULL,
  Pere integer NOT NULL,
  -- Clefs candidates
  PRIMARY KEY (Enfant),
  -- Clefs etrangeres
  FOREIGN KEY (Enfant) REFERENCES Genealogie.Personnes(Id),
  FOREIGN KEY (Mere) REFERENCES Genealogie.Personnes(Id),
  FOREIGN KEY (Pere) REFERENCES Genealogie.Personnes(Id),
  -- Contraintes d'integrite elementaire
  CHECK (Enfant <> Mere AND Enfant <> Pere AND Mere <> Pere)
);
CREATE TABLE Genealogie.Mariages (
  -- Typage des attributs
  Femme serial NOT NULL,
  Mari serial NOT NULL,
  DateMariage date NOT NULL,
  DateDivorce date NOT NULL DEFAULT 'infinity',
  -- Clefs candidates
  PRIMARY KEY (Femme, Mari, DateMariage),
  UNIQUE (Femme, Mari, DateDivorce),
  -- Clefs etrangeres
  FOREIGN KEY (Femme) REFERENCES Genealogie.Personnes(Id),
  FOREIGN KEY (Mari) REFERENCES Genealogie.Personnes(Id),
  -- Contraintes d'integrite elementaire
  CHECK (Femme <> Mari),
  CHECK (DateMariage < DateDivorce)
);
