16.2. Lesson: Implementando el Modelo de Datos

Ahora que hemos cubierto toda la teoría, pasemos a crear una nueva base de datos. Esta base de datos la vamos a utilizar para nuestros ejercicios en las lecciones que siguen a continuación.

El objetivo de esta lección: Instalar el software requerido y utilizarlo para implementar nuestra base de datos de ejemplo.

16.2.1. Instalar PostgreSQL

Nota

Although outside the scope of this document, Mac users can install PostgreSQL using Homebrew. Windows users can use the graphical installer located here: http://www.postgresql.org/download/windows/. Please note that the documentation will assume users are running QGIS under Ubuntu.

En Ubuntu:

sudo apt-get install postgresql-9.1

Deberá recibir un mensaje como este:

[sudo] password for qgis:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
postgresql-client-9.1 postgresql-client-common postgresql-common
Suggested packages:
oidentd ident-server postgresql-doc-9.1
The following NEW packages will be installed:
postgresql-9.1 postgresql-client-9.1 postgresql-client-common postgresql-common
0 upgraded, 4 newly installed, 0 to remove and 5 not upgraded.
Need to get 5,012kB of archives.
After this operation, 19.0MB of additional disk space will be used.
Do you want to continue [Y/n]?

Presione Y y Enter y espere a que la descarga e instalación termine.

16.2.2. Ayuda

PostgreSQL has very good online documentation.

16.2.3. Crear un usuario de base de datos

En Ubuntu:

After the installation is complete, run this command to become the postgres user and then create a new database user:

sudo su - postgres

Escriba su contraseña normal cuando se pida (necesita tener privilegios de sudo).

Now, at the postgres user’s bash prompt, create the database user. Make sure the user name matches your unix login name: it will make your life much easier, as postgres will automatically authenticate you when you are logged in as that user:

createuser -d -E -i -l -P -r -s qgis

Ingrese la contraseña cuando se pida. Debería usar una contraseña diferente a la contraseña de acceso.

¿Qué significan estas opciones?

-d, --createdb     role can create new databases
-E, --encrypted    encrypt stored password
-i, --inherit      role inherits privileges of roles it is a member of (default)
-l, --login        role can login (default)
-P, --pwprompt     assign a password to new role
-r, --createrole   role can create new roles
-s, --superuser    role will be superuser

Now you should leave the postgres user’s bash shell environment by typing:

exit

16.2.4. Verifique la nueva cuenta

psql -l

Debería mostrar algo como:

Name      |  Owner   | Encoding | Collation  |   Ctype    |
----------+----------+----------+------------+------------+
postgres  | postgres | UTF8     | en_ZA.utf8 | en_ZA.utf8 |
template0 | postgres | UTF8     | en_ZA.utf8 | en_ZA.utf8 |
template1 | postgres | UTF8     | en_ZA.utf8 | en_ZA.utf8 |
(3 rows)

Type q to exit.

16.2.5. Crear una base de datos

The createdb command is used to create a new database. It should be run from the bash shell prompt:

createdb address -O qgis

You can verify the existence of your new database by using this command:

psql -l

El cual mostrará algo como esto:

Name      |  Owner   | Encoding | Collation  |   Ctype    |   Access privileges
----------+----------+----------+------------+------------+-----------------------
address   | qgis     | UTF8     | en_ZA.utf8 | en_ZA.utf8 |
postgres  | postgres | UTF8     | en_ZA.utf8 | en_ZA.utf8 |
template0 | postgres | UTF8     | en_ZA.utf8 | en_ZA.utf8 | =c/postgres: postgres=CTc/postgres
template1 | postgres | UTF8     | en_ZA.utf8 | en_ZA.utf8 | =c/postgres: postgres=CTc/postgres
(4 rows)

Type q to exit.

16.2.6. Iniciando una sesión en un entorno de base de datos

Puede conectarse a su base de datos tan fácilmente como:

psql address

Para salir del entorno psql de la base de datos, escriba:

\q

Para obtener ayuda de cómo usar el entorno, escriba:

\?

Para obtener ayuda de cómo usar comandos sql, escriba:

\help

Para obtener ayuda de un comando específico, escriba (por ejemplo):

\help create table

See also the Psql cheat sheet - available online here.

16.2.7. Crear tablas en SQL

Let’s start making some tables! We will use our ER Diagram as a guide. First, connect to the address db:

psql address

Luego cree la tabla streets:

create table streets (id serial not null primary key, name varchar(50));

serial y varchar son tipos de datos. serial indica a PostgreSQL que comience una secuencia de entero (auto-numerada) para introducir el id automáticamente en cada nuevo registro. varchar(50) le indica a PostgreSQL crear un campo de caracter con un ancho de 50 caracteres.

You will notice that the command ends with a ; - all SQL commands should be terminated this way. When you press Enter, psql will report something like this:

NOTICE:  CREATE TABLE will create implicit sequence "streets_id_seq"
         for serial column "streets.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index
         "streets_pkey" for table "streets"
CREATE TABLE

Eso significa que su tabla fue creada satisfactoriamente, con la clave primaria calles_pkey using calles.id.

Nota: Si presiona enter sin haber escrito el ;, obtendrá unos símbolos como address-#. Esto es porque PG está esperando que introduzca más información. Ingrese ; para ejecutar su comando.

To view your table schema, you can do this:

\d streets

Which should show something like this:

Table "public.streets"
Column  |         Type          |            Modifiers
--------+-----------------------+--------------------------------------
 id     | integer               | not null default
        |                       | nextval('streets_id_seq'::regclass)
 name   | character varying(50) |
Indexes:
  "streets_pkey" PRIMARY KEY, btree (id)

To view your table contents, you can do this:

select * from streets;

Which should show something like this:

id | name
---+------
(0 rows)

Como puede ver, nuestra tabla actualmente está vacía.

16.2.7.1. Try Yourself moderate

Use la propuesta de arriba para hacer una tabla llamafa personas:

Agregue campos como número de teléfono, dirección, nombre, Etc. (estos no son nombres de campo válidos: cámbielos para hacerlos válidos). Asegúrese de incluir una columna ID con el mismo tipo de datos como la de arriba.

Compruebe sus resultados

16.2.8. Crear Claves en SQL

El problema con nuestra solución de arriba, es que la base de datos no sabe que las tablas personas y calles tienen una relación lógica. Para indicar esta relación, necesitamos definir una clave externa que apunte a la Clave Primaria de la tabla calles.

../../../_images/er-people-streets.png

Hay dos maneras de hacer esto:

  • Agregar la clave después de que la tabla fue creada

  • Definir la clave al tiempo de crear la tabla

Our table has already been created, so let’s do it the first way:

alter table people
  add constraint people_streets_fk foreign key (street_id) references streets(id);

Esto indica que el campo street_id de la tabla people deberá coincidir con con un id válido de la tabla streets.

El modo más usual de crear una restricción es hacerlo cuando se está creando la tabla:

create table people (id serial not null primary key,
                     name varchar(50),
                     house_no int not null,
                     street_id int references streets(id) not null,
                     phone_no varchar null);

\d people

After adding the constraint, our table schema looks like this now:

Table "public.people"

  Column   |         Type          |            Modifiers
-----------+-----------------------+---------------------------------
 id        | integer               | not null default
           |                       | nextval('people_id_seq'::regclass)
 name      | character varying(50) |
 house_no  | integer               | not null
 street_id | integer               | not null
 phone_no  | character varying     |
Indexes:
  "people_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
  "people_streets_fk" FOREIGN KEY (id) REFERENCES streets(id)

16.2.9. Crear Indices en SQL

We want lightning fast searches on peoples names. To provide for this, we can create an index on the name column of our people table:

create index people_name_idx on people(name);

\d people

Which results in:

Table "public.people"

  Column   |         Type          |                      Modifiers
-----------+-----------------------+-----------------------------------
 id        | integer               | not null default nextval
           |                       | ('people_id_seq'::regclass)
 name      | character varying(50) |
 house_no  | integer               | not null
 street_id | integer               | not null
 phone_no  | character varying     |
Indexes:
 "people_pkey" PRIMARY KEY, btree (id)
 "people_name_idx" btree (name)    <-- new index added!
Foreign-key constraints:
 "people_streets_fk" FOREIGN KEY (id) REFERENCES streets(id)

16.2.10. Eliminando Tablas en SQL

If you want to get rid of a table you can use the drop command:

drop table streets;

Nota

En nuestro ejemplo actual, el comando de arriba no funciona. ¿Por qué no? Vea porque

drop table people;

Nota

Si ingresó el comando y eliminó la tabla people, ahora sería buen momento para reconstruirla, pues la necesitará en los próximos ejercicios.

16.2.11. Una palabra sobre pgAdmin III

Hemos estado mostrando los comandos SQL desde la consola psql porque es un modo muy útil para aprender sobre bases de datos. Sin embargo, existen modos más rápidos y fáciles para hacer mucho de lo que hemos estado mostrando. Instale pgAdmin III y podrá crear, eliminar, modificar, Etc. tablas usando operaciones apuntar y hacer click en una GUI.

Under Ubuntu, you can install it like this:

sudo apt-get install pgadmin3

pgAdmin III se tratará con más detalle en otro módulo.

16.2.12. In Conclusion

Ha visto hasta ahora como crear una nueva base de datos empezando completamente desde cero.

16.2.13. What’s Next?

A continuación verá cómo usar el DBMS para agregar datos nuevos.