Skip to content

dbistuer/Exercici1-RA1

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 

Repository files navigation

Entrega Exercici 1- RA1 - Objectes, classes i herència a Postgres

L'objectiu d'aquest exercici és conèixer i practicar el concepte de classes, objectes i herències en el SGBD Postgres.

Per això:

Llegir: https://www.postgresql.org/docs/current/static/ddl-inherit.html

( assegurar de llegir la documentació en la versió de postgres que vosaltres utilitzeu)

  1. Seguiu l'exemple explicat: creant la taula Cities i Capitals. Proveu de fer insercions en ambdues taules i veure els resultats.

    Script de creacio i eliminacio si existeixen les taules per crearles.

DROP TABLE IF EXISTS capitals;
DROP TABLE IF EXISTS cities;

CREATE TABLE cities (
    name            text,
    population      float,
    altitude        int     -- in feet
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);

Insercio de dades a les taules:

INSERT INTO capitals VALUES('SP');
INSERT INTO cities VALUES('DANI',23.50,120);
INSERT INTO capitals VALUES('ES',145.23,12);

Inserto 2 registres a la taula "capitals" i un a la taula "cities".

Mostro les dades de les taules creades anteriorment.

SELECT * FROM capitals;

Tal i com es pot veure en la imatge que ve a continuacio s'han inserit els 2 registres a la taula.

selectcapitals

SELECT * FROM cities;

Tal i com es pot veure a la imatge anterior, s'ha insertat el registre que s'ha inserit amb un insert, i apart s'han inserit els 2 registres de la taula que te herencia de aquesta.

selectcities

  1. Per què creieu que s'utilitza el tableoid ? i el pg_class ?

tableoid

TABLEOID és un valor sencer d'increment automàtic, únic dins d'una base de dades PostgreSQL (no només una taula) que es pot assignar automàticament a cada fila d'una taula. Si un registre s'hereta d'una altra taula com l'instancia d'aquest sera la mateixa tindra el mateix OID.

Tot i que OID es pot utilitzar com a clau primària d’identitat d'una columna(increment automàtic), es recomana utilitzar el tipus de dades SERIAL.

pg_class

El catàleg pg_class cataloga les taules i la majoria de totes les altres que tinguin columnes o siguin similars a una taula. Inclou índexs (però també pg_index), seqüències, vistes, tipus compostos i alguns tipus de relació especial; vegeu relkind. A continuació, quan ens referim a tots aquests objectes, parlem de "relacions". No totes les columnes tenen sentit per a tots els tipus de relació.

  1. Al llegir la documentació. Penseu que es pot utilitzar l'herència múltiple en Postgres ? Fiqueu algun exemple

Si, l'herencia multiple a postgres existeix.

CREATE TABLE vehicle ( name text );
CREATE TABLE boat () INHERITS (vehicle);
CREATE TABLE car () INHERITS (vehicle);

CREATE TABLE boatcar () INHERITS (boat,car);

INSERT INTO boatcar (name) VALUES ('amphibious car');

A totes les columnes antriors, s'haura inserit a la primera fila : 'amphibious car'.

  1. Identifiqueu algunes limitacions de l'herència en Postgres. Estudieu com es propaguen les foreign keys o els canvis de taules etc.. d'una classe "pare" o superclasse a les seves classes "filles". Podeu consultar per les instruccions:SELECT, UPDATE, DELETE, ALTER TABLE, ALTER TABLE ... RENAME, vauum, reindex).

La primera limitacio que vec, es que si tu elimines un registre de una superclasse o una classe filla aquest, s'elimina en tots els llocs. I aixo pot ser un problema, ja que si tu vols eliminar un objecte d'una classe filla pero no d'una superclasse aixo no es possible sense canviar el OID.

El suport a orientació a objectes és una simple extensió que ofereix prestacions com l'herència, no un suport complet.

TAULES:

DROP TABLE IF EXISTS estudiant;
DROP TABLE IF EXISTS persona;

CREATE TABLE persona (
    name        text,
    cognom      text,
    edat        int
);

CREATE TABLE estudiant (
    matricula   int
) INHERITS (persona);

Creo dues taules:

  • La primera 'persona' te els atributs: nom, cognom i edat.
  • La segona 'estudiant' nomes conte: matricula. Pero com herede de persona tambe conte: nom, cognom i edat.

INSERTS:

INSERT INTO persona VALUES('DANI','BISTUER',23);

Inserto dades a la taula pare, i aquests no seran inserits a la taula filla:

2

1

Pero si ho faig a l'inreves i inserto a la taula filla si que s'inserira a la taula pare i els primers camps son els de la taula pare. per tant el insert a la taula filla ha de ser el seguent:

INSERT INTO estudiant VALUES('ANTONIO','PADILLA',96,123456);

1

1

UPDATE

Tant com si faig l'UPDATE desde la taula filla com de la taula pare les dades seran modifeicades per les dues .

TAULA FILLA(estudiant)

		UPDATE estudiant SET name='HERNESTO' WHERE edat=96;

1

1

​ Tal i com pots comprovar els canvis han sigut a les dues taules.

TAULA PARE(persona)

		UPDATE persona SET name='ALBERT' WHERE edat=96;

1

1

​ Tal i com pots comprovar els canvis han sigut a les dues taules.

DELETE

Per a fer el delete insertare mes dades a la taula filla per a tenirlos a les dues dades:

INSERT INTO estudiant VALUES('PEP','GARCIA',90,123457);
INSERT INTO estudiant VALUES('JOAN','MARIN',80,123453);

TAULA FILLA(estudiant)

		DELETE FROM estudiant WHERE edat=90;

​ Quant l'elimino, aquest s'elimina de la taula pare:

1

1

TAULA PARE(persona)

		DELETE FROM persona WHERE edat=80;

​ Tambe quant l'elimino s'eliminara de la taula filla:

1

pare2

ALTER TABLE

TAULA PARE(persona)

​ Inserare una columna a la taula pare, i aquesta tambe s'insertara a l'estudiat.

		ALTER TABLE persona ADD COLUMN paisOrigen text;

​ Per tant els inserts amb aquesta nova columna inserida serien aixi:

		INSERT INTO persona VALUES('VICTOR','DARIAS',70,'XINA');
		INSERT INTO estudiant VALUES('JOAN','MARIN',80,123453,'españa');

TAULA FILLA(estudiant)

​ Al insertar una columna a la taula filla no li passa res a la taula pare perque no hi ha herencia inversa. Simplement la taula estudiant tindra un nou camp.

		ALTER TABLE estudiant ADD COLUMN descripcio text;

RENAME ​ Serveix per a renombrar tant siguin colunes com taules:

COLUMNES

ALTER TABLE productes RENAME COLUMN no TO numero;

TAULES

ALTER TABLE productes RENAME TO items;

VACUUM ​ VACUUM recupera l'emmagatzematge ocupat per tuples morts. En l’operació normal de PostgreSQL, les tuples que s’esborren o queden obsoletes per una actualització no queden físicament retirades de la seva taula; romanen presents fins que es faci un VACUUM. Per tant, cal fer VACUUM periòdicament, especialment en taules actualitzades amb freqüència.

REINDEX ​ Per canviar el factor d'emplenament d'un índex (assumint que el mètode d'índex ho suporta):

ALTER INDEX distributors SET (fillfactor = 75);

REINDEX INDEX distributors;

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published