domingo, 10 de março de 2013

Database - Namespaces

Neste post falarei sobre Namespaces, um conceito simples mas importante para dominar a nomenclatura de objetos.

Namespace é um espaço imaginário composto por um ou mais tipos de objetos. Ele pode pertencer ao banco de dados como um todo, a um schema ou até mesmo a um tipo de objeto do schema. Ele é gerenciado automaticamente pelo SGDB, não pode ser criado, alterado ou eliminado. Sua função é restringir o nome dos objetos no banco de dados.

Segue abaixo uma figura extraída de um livro de Steve O'Hearn que apresenta como são divididos os namespaces.
Os Index e Constraints possuem um namespace próprio dentro de cada schema, já Tables, Views, Sequences, Private Synonyms e User-Defined Types compartilham o mesmo namespace em cada schema. Com isto pode-se dizer que é possível ter um  table abc, com um index abc e uma constraint abc no schema_1 e outra table abc, com index abc e constraint abc no schema_2, porém em nenhum destes schemas seria possível criar uma view abc pois já possuem um table abc. Users, Roles e Public Synonyms pertencem a um namespace único para todo Database, ou seja não é possível ter uma role xyz se já houver um user xyz.

sábado, 9 de março de 2013

Database - Nomenclarutra dos objetos

Neste post apresentarei algumas regras para a nomenclatura dos objetos no banco de dados Oracle.
Todos os objetos no banco de dados, até mesmo as colunas das tabelas, deverão ser nomeados de acordo com as seguintes regras.
  • Minimo 1 caractere;
  • Máximo 30 caracteres;
  • O primeiro caractere deve ser uma letra;
  • Além de número e letras, apenas os caracteres especiais  "$", "_" e "#" são permitidos. 
  • Acentuação não é permitida.
  • Não podem coincidir com as palavras reservadas (CREATE, TABLE, COLUMN, NUMBER, FROM, SELECT...)
  • Ser único no namespace do objeto.
Outro aspecto que vale citar aqui é a diferenciação de maiúsculas e minúsculas, mais conhecido por Case insensitive/Case sensitive. Por padrão, todos objetos são criados de forma Case Insensitive, ou seja, o objeto pode ser referenciado sem a diferenciação de maiúsculas e minúsculas. Porém, também é possível criar objetos com nomes no estilo case sensitive. Não vejo nenhum beneficio em utilizar nomeclatura em formato case sensitive, mas é importate conhecer como funciona. Abaixo demonstrarei com fazer isto.

Criarei uma tabela simples, observe que a primeira letra é maiúscula e o restante minúsculo. Também utilizei números e um caracter especial apenas para enfatizar que eles podem ser utilizados.
SQL> create table Tabela123# (id number(4), descricao varchar2(50));

Table created.

Agora, vamos ver como ela foi criada pelo banco.
SQL> select table_name from user_tables where table_name='Tabela123#'; 

no rows selected

SQL> select table_name from user_tables where table_name='TABELA123#';

TABLE_NAME
------------------------------
TABELA123#

Ok, o banco criou em tudo maiusculo. Mas vamos fazer um teste selecionando a tabela de diversas formas.
SQL> select count(*) from tabela123#;

  COUNT(*)
----------
         0

SQL> select count(*) from TABELA123#;

  COUNT(*)
----------
         0

SQL> select count(*) from Tabela123#;

  COUNT(*)
----------
         0
Ótimo, está case insensitive. Os SQL funcionaram tanto para maiúsculo quanto minúsculo.

Agora vou mostrar como criar uma tabela com nome no estilo case sensitive. Fazer isto é muito simples, basta utilizar aspas duplas no nome do objeto.
SQL> create table "Tabela456#" (id number, descricao varchar2(30));

Table created.

SQL> select table_name from all_tables where upper(table_name) like 'TABELA%';

TABLE_NAME
------------------------------
TABELA123#
Tabela456#

Quando se utiliza esta forma de nomeclatura para o objeto, o mesmo deve ser sempre referenciado utilizando aspas duplas, caso contrário o banco irá retornar ORA-00942 informando que o objeto nao foi encontrado.
SQL> select * from Tabela456#;
select * from Tabela456#
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select * from TABELA456#;
select * from TABELA456#
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select * from "Tabela456#";

no rows selected


As regras que apresentei são válidas para outros objetos do banco, como View, Procedure, Function, Synonym, Package, Triggers e etc. Procure utilizar um padrão de nomenclatura para todo o sistema e sempre da forma mais intuitivo possível, isto facilitará a manutenção no futuro.