Disseny de bases de dades: Del model conceptual al model lògic

El disseny de bases de dades comença per una primera etapa de disseny lògic de la base de dades. En aquesta etapa es fa un disseny en termes del paradigma general de la base de dades utilitzada (relacional, OO, XML, etc.) que permeti representar la informació que s’ha determinat, durant l’anàlisi, que caldrà desar a la base de dades.

Aquest article és una esquema sobre els punts més importants a l’hora de fer el disseny lògic per a una base de dades relacional a partir d’un anàlisi orientada a objectes documentada en UML.

Objectius

  • Conèixer les principals alternatives per atacar el model lògic d'una base de dades a partir del model conceptual
  • Saber aplicar les tècniques de disseny més importants per resoldre les situacions més habituals

Clau primària

Triar una clau primària

  • UML utilitza OO i, per tant, fa servir OID per a identificar objectes
  • El model relacional fa servir la clau primària
  • Cal triar una clau primària per a cada classe
  • Fer servir una clau externa del model UML

Substituts de la clau primària

Problema

  • No existeix clau externa
  • Existeix clau externa però té molts atributs
  • Volem poder modificar tots els atributs d'un objecte sense que en canviï la clau

Solució

  • Afegir una columna sense significat que es pugui fer servir per identificar la fila
  • Acostumen a ser comptadors que s'incrementen cada cop que afegim una fila
  • No estan concebuts per a consultar sinó per a comparar

Substitut de clau primària per a My SQL:

1
2
3
4
CREATE TABLE animals(id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id));


INSERT INTO animals(name) VALUES('dog'),('cat');

Claus alternatives

Ús de claus alternatives

  • Una combinació d'atributs és clau
  • No és clau primària
    • Tenim un substitut
    • Hi ha una altra clau primària

Disseny

  • Marcar cada camp com NOT NULL
  • Fer una restricció UNIQUE de la combinació de camps

Exemple de clau alternativa per a una taula amb substitut de clau primària:

1
2
3
4
5
6
7
CREATE TABLE estudiants

(id MEDIUMINT AUTO_INCREMENT,

nom CHAR(30) NOT NULL, cognom1 CHAR(30) NOT NULL, cognom2 CHAR(30) NOT NULL,

PRIMARY KEY (id), UNIQUE(nom, cognom1, cognom2));

Associacions

Associacions binàries M:N

Associació Projecte - Desenvolupador amb cardinalitat * a tots dos extrems

Solució:

1
2
3
4
5
projectes(id,...)

desenvolupadors(id,...)

participa(proj->projectes(id),dev->desenvolupadors(id))
Associacions binàries 1:N
Associació

Solució:

1
2
3
projectes(id,...,cap->desenvolupadors(id) not null)

desenvolupadors(id,...)
Associació

Solució:

1
2
3
projectes(id,...,cap->desenvolupadors(id))

desenvolupadors(id,...)

Associacions binàries 1:1

Associació

Solució:

1
2
3
departaments(id,...,cap->professors(id) unique not null)

professors(id,...)
Associació

Solució:

1
profDept(idDepartament,...,idProfessor unique not null,...)

Associacions ternàries i N-àries

Associació

Solució:

1
2
3
4
5
6
7
persones(id,...)

projectes(id,...)

dates(id,...)

participa(p->persones(id),pr->projectes(id),d->data(id))

Associacions N-àries amb 0..1 en algun rol

El cas de les associacions N-àries (on N>2) en que algun rol té cardinalitat 0..1 és especial. Només cal convertir l’associació en una associació equivalent on tots els rols tinguin cardinalitat * i associar els altres rols a la classe associativa. És per això que considerarem que l’analista ja ha fet aquesta transformació.

Classe associativa

Classe Participacio amb atribut rol, associativa de l

Solució:

1
2
3
4
5
projectes(id,...)

desenvolupadors(id,...)

participacio(proj->projectes(id),dev->desenvolupadors(id),rol,...)

Composició com a entitat dèbil

Composició Empresa - Departament, on una empresa està composta per qualsevol nombre de departaments

Solució:

1
2
3
empreses(id,...)

departaments(empresa->empreses(id),id,...)

Generalització especialització

Una taula per classe

Especialització de la classe Persona en les classes Estudiant i Becari

Solució:

1
2
3
4
5
persones(id,)

estudiants(id->persones(id),atributsEspecifics)

becaris(id->persones(id),atributsEspecifics)

Símbols utilitzats:

Exemple: Exemple concret d'algun dels aspectes mencionats

Referències:

  • [DBD]:Sistach et al., Disseny de Bases de Dades. UOC
blog comments powered by Disqus