15.2. Lesson: Implementando o Modelo de Dado
Agora que nós cobrimos toda a teoria, vamos criar um novo banco de dados. Esta base de dados será utilizada para nossos exercícios para as aulas que seguirão depois.
A meta para esta lição: Instalar o software necessário e usá-lo para implementar o nosso banco de dados de exemplo .
15.2.1. Instalar PostgreSQL
Nota
Você pode encontrar pacotes PostgreSQL e instruções de instalação para seu sistema operacional em https://www.postgresql.org/download/. Observe que a documentação assumirá que os usuários estão executando o QGIS no Ubuntu.
Nos termos do Ubuntu:
sudo apt install postgresql-9.1
Você deveria ver uma mensagem assim:
[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]?
Pressione Y e Enter e aguarde o download e instalação terminar.
15.2.2. Ajuda
PostgreSQL tem uma documentação online muito boa.
15.2.3. Crie um usuário de banco de dados
Nos termos do Ubuntu:
Após a conclusão da instalação, execute este comando para se tornar o usuário do postgres e crie um novo usuário do banco de dados:
sudo su - postgres
Digite o seu log normal e senha quando solicitado ( você precisa ter os direitos do sudo ) .
Agora, no prompt do bash do usuário do postgres, crie o usuário do banco de dados. Verifique se o nome de usuário corresponde ao seu nome de usuário unix: isso facilitará sua vida, pois o postgres o autenticará automaticamente quando você estiver logado como esse usuário:
createuser -d -E -i -l -P -r -s qgis
Entre com a senha quando solicitado. Você deverá usar uma senha diferente para sua senha.
O que essas opções sugerem?
-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
Agora você deve deixar o ambiente do shell bash do usuário do postgres digitando:
exit
15.2.4. Verifique a nova conta
psql -l
Deve retornar algo como isso:
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)
Digite Q para sair.
15.2.5. Criar um banco de dados
O comando createdb
é usado para criar um novo banco de dados. Deve ser executado no prompt do bash shell:
createdb address -O qgis
Você pode verificar a existência do seu novo banco de dados usando este comando:
psql -l
Que deve retornar algo como:
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)
Digite Q para sair.
15.2.6. Iniciar uma sessão de tela de linha de comandos de banco de dados
Você pode conectar facilmente seu banco de dados desta forma:
psql address
Para sair da tela de linha de comando do psql, digite:
\q
Para ajuda no uso da tela de linha de comandos, digite:
\?
Para ajuda no uso dos comandos sql , digite:
\help
Para obter ajuda de um comando específico, digite (por exemplo):
\help create table
Veja também a folha de dicas Psql.
15.2.7. Faça tabelas em SQL
Vamos começar a fazer algumas tabelas! Usaremos nosso diagrama de ER como guia. Primeiro, conecte-se ao endereço db:
psql address
Em seguida, crie uma tabela streets
:
create table streets (id serial not null primary key, name varchar(50));
serial e varchar são tipos de dados. serial diz para o PostgreSQL iniciar uma sequência inteira (auto-número) para preencher o id automaticamente para cada novo registro. :kbd:` varchar(50)` diz para o PostgreSQL criar um campo de caracteres de 50 caracteres de comprimento.
Você vai perceber que o comando termina com um ; - todos os comandos SQL devem ser finalizados desta maneira. Quando você pressiona Enter, o psql vai relatar algo como isto:
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
Isto quer dizer que sua tabela foi criada com sucesso, com a chave primária streets_pkey usando streets.id.
Nota: Se você apertar “enter” sem inserir ;, então você receberá um aviso como este: address-#. Isto porque o PG está esperando que você digite mais. Digite ; para executar o seu comando .
Para visualizar seu esquema de tabela, você pode fazer isso:
\d streets
Que deveria mostrar algo como isto:
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)
Para visualizar o conteúdo da sua tabela, você pode fazer o seguinte:
select * from streets;
Que deveria mostrar algo como isto:
id | name
---+------
(0 rows)
Como você pode ver, sua tabela, no momento, está vazia.
Try Yourself
Use a abordagem mostrada acima para fazer uma tabela chamada people:
Adicione campos como número de telefone, endereço de casa, nome, etc (estes não são todos os nomes válidos: troque para validá-los). Tenha certeza que pegou a tabela com ID coluna com o mesmo tipo de informação acima.
Responda
O SQL necessário para criar a tabela de pessoas correta é:
create table people (id serial not null primary key,
name varchar(50),
house_no int not null,
street_id int not null,
phone_no varchar null );
O esquema para a tabela (digite \\d pessoas
) fica assim:
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)
Para fins de ilustração, omitimos propositalmente a restrição fkey.
15.2.8. Crie chaves no SQL
O problema com a nossa solução acima é que o banco de dados não sabe que as pessoas e as ruas têm uma relação lógica. Para expressar esta relação , temos que definir uma chave estrangeira que aponta para a chave primária da tabela de ruas .
Existem duas formas de fazer isso:
Adicione a chave após a tabela ser criada
Defina uma chave no momento da criação da tabela
Nossa tabela já foi criada, então vamos fazê-lo da primeira maneira:
alter table people
add constraint people_streets_fk foreign key (street_id) references streets(id);
Que diz a tabela people que os seus campos street_id deve corresponder uma rua válida id da tabela streets.
A maneira mais comum de criar uma restrição é fazer isso quando você cria a tabela:
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
Após a inclusão da restrição, nosso esquema de tabela fica assim agora:
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)
15.2.9. Criar Índices em SQL
Queremos pesquisas rápidas em nomes de pessoas. Para isso, podemos criar um índice na coluna de nome da nossa tabela de pessoas:
create index people_name_idx on people(name);
\d people
O que resulta em:
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)
15.2.10. Descartando tabelas em SQL
Se você quiser dispensar uma tabela, use o comando drop:
drop table streets;
Em nosso exemplo atual, o comando acima não funcionaria. Por que não?
Responda
A razão pela qual o comando DROP não funcionaria neste caso é porque a tabela pessoas tem uma restrição de chave estrangeira para a tabela ruas. Isso significa que descartar (ou excluir) a tabela ruas deixaria a tabela pessoas com referências a dados ruas inexistentes.
É possível ‘forçar’ a exclusão da tabela ruas usando o comando CASCATA
, mas isso também excluiria as pessoas e qualquer outra tabela que tivesse um relacionamento com a tabela ruas. Use com cuidado!
Se você usasse o mesmo comando drop table na tabela pessoas, seria bem-sucedido:
drop table people;
Nota
Se você realmente entrou com esse comando e descartou a tabela people, agora seria um bom momento para reconstruí-la, já que você vai precisar dela para os próximos exercícios.
15.2.11. Uma palavra sobre pgAdmin III
Estamos mostrando-lhe os comandos SQL do prompt de psql porque é uma forma muito útil para aprender sobre bancos de dados. No entanto, existem maneiras mais rápidas e mais fáceis de fazer muito do que estamos mostrando. Instale pgAdmin III e você poderá criar, descartar, alterar etc, tabelas usando ‘apontar e clicar’ em operações com uma GUI.
No Ubuntu, você pode instalar assim:
sudo apt install pgadmin3
O pgAdmin III será abordado em mais detalhes em outro módulo.
15.2.12. In Conclusion
Agora você já viu como criar um novo banco de dados, a partir do zero.
15.2.13. What’s Next?
Em seguida, você vai aprender como usar os DBMS para adicionar novos dados.