4.3. Herencia y OID

4.3. Herencia y OID Dataprix 21 Octubre, 2009 - 16:08

Los OID permiten que se diferencien los registros de todas las tablas, aunque sean heredadas: nuestro estudiante tendrá el mismo OID en las dos tablas, ya que se trata de única instancia de la clase estudiante:

 

demo=# select oid,* from persona ;
oid    |nombre                 | direccion
-------+-----------------------+-------------
17242 | Alejandro Magno       | Babilonia
17243 | Federico García Lorca | Granada 65
17247 | Juan                  | Treboles 21
(3 rows)
demo=# select oid,* from estudiante ;
oid    |nombre  |direccion    |carrera                    |grupo  | grado
-------+--------+-------------+---------------------------+-------+-------
17247  | Juan   | Treboles 21 | Ingenieria en Computación | A     |   3
(1 row)

Dado que no se recomienda el uso de OID en bases muy grandes, y debe incluirse explícitamente en las consultas para examinar su valor, es conveniente utilizar una secuencia compartida para padres y todos sus descendientes si se requiere un identificador.

En PostgreSQL, una alternativa para no utilizar los OID es crear una columna de tipo serial en la tabla padre, así será heredada en la hija. El tipo serial define una secuencia de valores que se irá incrementando de forma automática, y por lo tanto constituye una buena forma de crear claves primarias, al igual que el tipo AUTO_INCREMENT en MySQL.

demo=# create table persona (
demo(# id serial,
demo(# nombre varchar (30),
demo(# direccion varchar(30)
demo(# ) without oids;
NOTICE: CREATE TABLE will create implicit sequence `persona_id_seq´ for SERIAL column `persona.
NOTICE: CREATE TABLE / UNIQUE will create implicit index `persona_id_key´ for table `persona´ CREATE

La columna id se define como un entero y se incrementará  utilizando la función nextval() tal como nos indica la información de la columna:

demo=# \d persona
Table "persona"
Column   |Type                 |Modifiers
---------+---------------------+---------------------------------------------
       id|             integer |not null default nextval(`"persona_id_seq"`::text)
   nombre|character varying(30)|
direccion|character varying(30)|
Unique keys: persona_id_key

 

Al definir un tipo serial, hemos creado implícitamente una secuencia independiente de la tabla. Podemos consultar las secuencias de nuestra base de datos mediante el comando ‘\ds’:

demo=# \ds

                  List of relations

Schema |Name                 |Type      |Owner
--------+---------------------+----------+----------
public | productos_clave_seq | sequence | postgres
(1 row)

Creamos nuevamente la tabla estudiante heredando de persona:

create table estudiante (
demo(# carrera varchar(50),
demo(# grupo char,
demo(# grado int
demo(# ) inherits ( persona );
CREATE

El estudiante heredará la columna id y se incrementará utilizando la misma secuencia:

demo=# \d persona
Table "persona"
Column   |Type                 |Modifiers
---------+---------------------+---------------------------------------------
       id|             integer |not null default next-val(`"persona_id_seq"`::text)
   nombre|character varying(30)|
direccion|character varying(30)|
carrera |character varying(50)|
   grupo |         character(1)|
   grado |              integer|

Insertaremos en la tabla algunos registros de ejemplo, omitiendo el valor para la columna id:

demo=# insert into persona(nombre,direccion)
values ( `Federico García Lorca´ , `Granada 65´ );
demo=# insert into persona(nombre,direccion)
values ( `Alejandro Magno´ , `Babilonia´ );
demo=# insert into estudiante(nombre,direccion,carrera,grupo,grado)
values ( `Elizabeth´ , `Pino 35´, `Psicologia´ , `B´ , 5 );

 

La tabla estudiante contendrá un  solo registro, pero su identificador es el número 3.

demo=# select * from estudiante;
id |nombre     |direccion  |carrera     |grupo  |grado
---+-----------+-----------+------------+-------+-------
3  | Elizabeth | Pino 35   | Psicologia |   B   |  5
(1 row)

Todos los registros de persona siguen una misma secuencia sin importar si son padres o hijos:

demo=# select * from persona;
id |nombre                |direccion
----+----------------------+------------
  1 | Federico Garca Lorca | Granada 65
  2 |      Alejandro Magno | Babilonia
  3 |            Elizabeth | Pino 35
(3 rows)

La herencia es útil para definir tablas que conceptualmente mantienen elementos en común, pero también requieren  datos que los hacen diferentes. Uno de los elementos que conviene definir como comunes son los identificadores de registro.