2008-04-24

DebianDayPT 2008


Está em preparação o evento comemorativo do 15º Aniversário da distribuição Debian. Será em 16 de Agosto deste ano, em Aveiro (se tudo correr como previsto).
Passem por http://www.debianpt.org/debiandaypt e fiquem a conhecer os detalhes deste "work-in-progress"

2008-04-05

Partições de Dados - II

Já antes aqui tinha escrito da importância que pode ter uma correcta partição dos dados presentes numa base de dados de certa dimensão. Com os SGBDs modernos temos hipótese de usar diversos métodos de executar estas partições.

Os diferente métodos de particionamento de uma tabela dividem-se de acordo com a "orientação" das partições, e também de acordo com o modo como se definem os limites das partições.

Quanto à orientação, temos particionamentos "verticais" e "horizontais". O particionamento "vertical" consiste na divisão de registos com muitos campos em duas ou mais tabelas relacionadas e é, no fundo, a base da normalização.

O particionamento "horizontal" implica a divisão por duas ou mais tabelas dos registos inicialmente contidos numa só tabela. Esta divisão é feita considerando os valores de um campo de interesse. Normalmente consideram-se como interessantes para definir partições campos que tenham algum significado lógico no âmbito da aplicação usada, por exemplo, se tivermos uma tabela que guarde documentos é lógico dividi-la por datas.

Ao criar as partições de dados temos várias hipóteses de definir os intervalos a considerar: Intervalos de Valores, Listas, Funções de Hash ou combinações destas.

A particão de tabelas baseada em intervalos é talvez a mais comum e divide simplesmente a tabela original de acordo com o intervalo definido, por exemplo, se tivermos uma tabela de documentos "Doc" que armazene a data do documento no campo "DataDoc", podemos criar partições anuais (este exemplo é em PostgreSQL):

CREATE TABLE Doc_1999 (
CHECK( DataDoc >= DATE '01-01-1999' AND DataDoc <= DATE '31-12-1999') INHERITS (Doc) ; CREATE TABLE Doc_2000 ( CHECK( DataDoc >= DATE '01-01-2000' AND DataDoc <= DATE '31-12-2000' ) INHERITS (Doc) ; ... CREATE TABLE Doc_2008 ( CHECK( DataDoc >= DATE '01-01-2008' AND DataDoc <= DATE '31-12-2008' ) INHERITS (Doc) ;

Claro que teríamos que ter o cuidado necessário para criar a restante estrutura e código para validar esta divisão. Noutros SGBD, por exemplo em Oracle, podíamos fazer simplesmente:

CREATE TABLE Doc(...)
PARTITION BY RANGE (DataDoc)
(
PARTITION Doc_1999 VALUES LESS THAN (to_date('01-Jan-2000')),
PARTITION Doc_2000 VALUES LESS THAN (to_date('01-Jan-2001')),
...
)

Em vez deste tipo de divisão, podemos usar uma lista de valores, por exemplo Cidades ou Países para obter as partições. Neste caso a diferença está na definição dos limites. Por exemplo, vendo o caso de uma tabela de Clientes que tivesse uma coluna Cidade, poder-se-ia fazer alguma coisa do género:
CREATE TABLE Clientes_Lisboa (
CHECK( Cidade = 'Lisboa') INHERITS (Clientes) ;
CREATE TABLE Clientes_Porto (
CHECK( Cidade = 'Porto') INHERITS (Clientes) ;
...

Por último, a divisão por Hash, usa uma função Hash para obter um valor que vai servir de base à definição das partições.