# Objetos de Base de datos

---

# Objetos de Base de datos (típicos)

* **Base de datos** (database): es un contenedor de otros objetos como tablas, vistas, funciones, indices, etc.
* **Tabla** (table): se usa para estructurar los datos almacenados, permite la herencia de tablas.
* **Esquema** (schema): es un contenedor lógico de tablas y otros objetos dentro de una base de datos.
* **Vista** (view): una tabla virtual, para simplificar consultas o securizar.

---

# Objetos de Base de datos (tablespace)

* **Tablespace**
    * Definen a que **ruta de sistema** se **almacenan** los datos.
    * Por ejemplo, una tabla de una base de datos a una ruta específica.
    * **Ventajas**: 
        * Una tabla que **no requiera rendimiento** escriba a un **disco lento y grande**. 
        * Una tabla que así lo requiera escriba a un **disco rápido y pequeño**.
    * [Más info en la doc de postgresql](http://www.postgresql.org/docs/9.3/static/manage-ag-tablespaces.html)


--- 

# Objetos de Base de datos (otros)

* **Función** (function): Una función es código SQL re-utilizable.
* **Operador** (operator): es una función simbólica.
* **Cast**: permiten convertir un tipo de datos en otro, en definitiva funciones. Se pueden sobreescribir casts por defecto.
* **Secuencia** (sequence): se utilizan para controlar las campos auto-incrementales de las tablas.
* **Disparador** (trigger): asocian eventos de base de datos con ejecución de funciones

--- 

# Objetos de Base de datos (extension)
* **Extensión** (extension)
    * Postgresql deja partes interesantes del proyecto para desarrollo aparte
    * Esas partes se incorporan al servidor mediante extensiones
    * Implican tipos nuevos, indices, funciones, etc.
    * PostgreSQL **contrib**
        * Utilidades que no están instaladas por defecto. Desarrolladas y distribuidas con el *core*.
        * Desde 9.1: `CREATE EXTENSION module_name;`
        * [Lista contrib modules](http://www.postgresql.org/docs/9.3/static/contrib.html)

---

# Extensión postgis

* [Postgis](http://postgis.net/), extensión geoespacial para postgresql
* Permite operar con tipos de datos relacionados con **posiciones espaciales**
* Tiene **funciones** para operar con esos datos:
    * Consultas de puntos dentro de un radio o un poligono
* **Poca competencia** en bases de datos relacionales:
    * [La de Oracle](http://www.oracle.com/us/corporate/pricing/technology-price-list-070617.pdf) es muy cara
    * [La de Mysql](http://www.programering.com/a/MTNwQjMwATI.html) es menos funcional, menos estable y con menos rendimiento
    * ¿[SQLServer](http://msdn.microsoft.com/es-es/library/bb933790.aspx)?
* Se integra muy bien con ORMs como el de Django
* Se está convirtiendo en **indispensable** al necesitar geolocalización

---

#  Extensión oid2name

    !bash
    postgres@canape:~$ /usr/lib/postgresql/9.3/bin/oid2name 
    All databases:
        Oid       Database Name  Tablespace
    -----------------------------------------
    227923                abi4  pg_default
    656166       agregadoresdb  pg_default
    729346          agrofincdb  pg_default
    ...


    postgres@canape:~$ oid2name  -d abi4
    From database "abi4":
    Filenode                             Table Name
    -------------------------------------------------
        230572                             auth_group
        230577                 auth_group_permissions
        230582                        auth_permission
        230587                              auth_user
        ...

