Lição 1: Trabalhando com Tabelas e Tipos de Dados

maio 17, 2011

 

Modelar, criar e manter tabelas é uma das funções mais importantes de um desenvolvedor de banco de dados.

Tipos de Dados

Antes de criar uma tabela você precisa entender as diferenças entre os tipos de dados que você pode utilizar em uma coluna. Há dois tipos diferentes de tipos de dados no Sql Server:

  • Tipos de dados de sistema.
  • Tipos de dados de usuários (User-Defined types – UDTs) ou Sql Common Language Runtime (CLR).

Cadeias de Caracteres

Existem alguns tipos de dados string no Sql Server, são eles: char, varchar, nchar, nvarchar, text, ntext.

A diferença entre char e varchar (assim como nchar e nvarchar) é fato do char possuir tamanho fixo e varchar tamanho variável, ou seja char sempre aloca o espaço suficiente em disco para armazenar o tamanho declarado e varchar armazena apenas o tamanho do dado inserido. A vantagem de utilizar char é que as atualizações feitas na coluna nunca requer o deslocamento da linha pois os dados inseridos sempre utilizam o mesmo tamanho, em contra partida varchar aloca muito menos espaço do que char.

Para os tipos de dados char e varchar a collation é utilizada para especificar o code page (conjunto de caracteres) do conteúdo da coluna. A collation também é utilizada para definir como ordenar e comparar os dados armazenados. A nomenclatura da collation especifica algumas características:

  • CI – Case Insensitive
  • CS – Case Sensitive
  • AI – Accent Insensitive
  • AS – Accent Sensitive

Nchar e nvarchar armazenam caracteres utilizando o Unicode universal code page (UCS-2). 

 

Tipos numéricos exatos

Os números numéricos exatos são inteiros ou decimais, produzem o mesmo resultados exceto pelo processamento ou pela magnetude (tamanho) dos números.

cbcpt5ok

 

Tipos numéricos aproximados

O sql server suporta dois tipos numéricos com pontos flutuantes o real e o float, assim como o decimal, ambos aceitam parâmetros. Os parâmetros definem o numero de bits que será utilizado para armazenar o dado.

image

 

Manipulando Data e Hora

A tabela abaixo possui um breve resumo sobre os tipos de dados de data e hora.

image

É necessário entender as diferenças entre smalldatetime e datetime pois há dois grandes problemas, um deles é que a hora e dia são armazenados juntos e isso precisa ser levado em consideração, veja o exemplo a seguir:

SELECT SalesOrderID

             ,CustomerID

             ,OrderDate

FROM Sales.SalesOrderHeader

WHERE OrderDate=‘20080818’

A Consulta apenas retorna pedidos realizados no dia 18/08/2008 exatamente as 00:00:00. Para resolver esse problema você precisa especificar o horário na consulta, como nos exemplos abaixo:

–Query #1

SELECT SalesOrderID ,CustomerID ,OrderDate

FROM Sales.SalesOrderHeader

WHERE OrderDate BETWEEN ‘2008-08-18T00:00:00’ and ‘2008-08-18T23:59:59.997’

 

–Query #2

SELECT SalesOrderID ,CustomerID ,OrderDate

FROM Sales.SalesOrderHeader

WHERE OrderDate>=‘20080818’ and OrderDate <‘20080819’

 

Ambas consultas produzem o mesmo resultado, porém considere utilizar o segundo exemplo pois o mesmo atende tanto datetime quanto datetime2.

O tipo de dados time aceita um parâmetro para especificar a precisão ou número de decimais por fração de segundo. Quando o parâmetro não é especificado a precisao é de 7 casas decimais.

 

Tabelas Básicas

No Sql Server há três tipos de variações de tabelas: permanentes, temporárias locais e temporárias globais, além dessa variações temos os tipos de tabelas e parâmetros da tabela.

 

Criando uma tabela

Antes de criar uma tabela é necessario especificar o schema. Schema é similar a namespace em diversas linguagens de programação, o Sql Server possui os schemas sys para objetos de sistema e dbo para novos objetos.

CREATE SCHEMA Sales;

GO 

CREATE TABLE Sales.Customers(

CustomerId INT NOT NULL,

Name NVARCHAR(50) NOT NULL);

Tabelas também podem ser criadas a partir de uma query utilizando o comando select into:

SELECT * INTO Sales.Customers_Copy from Sales.Customers

 

Nomenclatura de colunas e tabelas

Ambos, tabelas e colunas, são identificadores e precisam obedecer algumas regras de nomenclatura:

Identificadores Padrão (Standard)

  • O primeiro caracteres deve ser letra ou underscore (_).
  • Caracteres seguintes podem ser dígitos, @, $, # e _.
  • Não deve ser uma palavra reservada do T-SQL.
  • Espaços em branco não são aceitos.

 

Identificadores Delimitados

As mesmas caracteristas do Standard, com exceto que voce pode criar nomes com espaço em banco utilizando as aspas (“”) ou colchetes ([]). Precisa estar setado como ON a propriedade QUOTED_IDENTIFIER.

 

Criando a tabela

Agora vamos criar uma tabela, veja o exemplo:

CREATE TABLE HR.Employees(

EmployeeID INT IDENTITY(1000,2) NOT NULL

,FirstName NVARCHAR(50) NOT NULL

,LastName NVARCHAR(50) NOT NULL

,PhoneNumber VARCHAR(15) NULL

,BirthDate DATE NOT NULL );

Esse código cria a tabela Employees com cinco colunas. Podemos especificar o schema que será utilizado, nesse caso HR.

As colunas são definidas utilizando três propriedades básicas: nome da

coluna, tipo de dado e nullabilidade (se a coluna aceita null o ou não).

 

Nomenclatura

Ao escolher a nomenclatura de tabelas e colunas é importante seguir o padrão da organização ou algumas diretrizes. São elas:

  • Utilize PascalCasing (também conhecido como Camel Casing).
  • Evite abreviações.
  • Longos nomes que usuários entendem são preferíveis a nomes curtos que podem não ser entendidos.

 

Escolhendo Tipos de dados

A escolha do tipo de dado certo para cada coluna é muito importante, para ajudá-lo segue algumas diretrizes que você pode seguir:

  • Sempre utilize um tipo de dado que utilizar o mínimo de espaço em disco.
  • Mudar o tipo de dados posterior à criação da tabela pode ser muito custoso, não utilize um tipo de dado se o mesmo não atende as necessidades da aplicação.
  • Sempre que possível utilize tipos de dados com tamanho variável, como nvarchar e varchar.
  • Um dos poucos casos em que o char e nchar são indicados é quando o valor da coluna requer alteração constante, nesse caso o custo de mover a linha com tamanho variável é maior do que a com tamanho fixo.
  • Evite o uso dos tipos datetime e smalldatetime, pois ambos ocupam mais espaço em disco e provem menos precisão do que os tipos datetime2, date e time.
  • Utilize varchar (Max), nvarchar (Max) e varbinary (Max) ao invés de text, ntext e image, pois poderão ser descontinuados em futuras versões.
  • Use o tipo de dado rowversion ao invés de timestamp, pois poderá ser descontinuado em futuras versões.
  • Somente Utilize varchar (max), nvarchar(max) e varbinary(max) e xml, quando não há como especificar a quantidade de caracteres a ser utilizada, pois esses campos não podem ser utilizados para índices.
  • Use float e real apenas quando a precisão do decimal for insuficiente.

 

Nulo ou Não Nulo?

Você nunca deve utilizar valores no lugar do nulo (ex –1 para inteiro), isso pode causar problemas futuramente. Nulo é um valor desconhecido e será diferente de –1, em uma função de agregação, por exemplo, AVG, o –1 é incluso no cálculo e o nulo não.

 

Identity

Todas tabelas possuem uma coluna ou um conjunto de colunas que identificam a linha, a primary key . Não é fácil definir uma boa coluna para ser a primary key , pois esses dados podem variar com frequência. Para contornar essa situação você pode utilizar uma coluna que gere automaticamente uma chave. O comando IDENTITY é utilizado para determinar uma coluna por tabela onde o valor será acrescido ou decrescido automaticamente quando um valor novo é inserido, esse campo não aceita valores nulos.

Sintaxe:

CREATE TABLE HR.Employees(

EmployeeID INT IDENTITY(1000,2) NOT NULL

,FirstName NVARCHAR(50) NOT NULL

,LastName NVARCHAR(50) NOT NULL

,BirthDate DATE NOT NULL

);

A numeração irá iniciar do 1000 e será acrecido de 2 em 2,  o ser valor negativo também.

A propriedade IDENTITY  não poderá ser utilizada em um campo já existente, somente em campos novos.

Quando um insert  falha a coluna dará sequencia para o próximo valor, veja no exemplo:

clip_image002

 

Compressão

Na versão SQL Server 2008 Enterprise, você pode comprimir dados em tabelas e índices, essa compressão pode ser implementada em dois níveis: linha e página.

ALTER TABLE HR.Employees

REBUILD

WITH (DATA_COMPRESSION=PAGE);

Quando a compressão de dados é ativada, o SQL Server irá converter todos os tipos de dados para variable-length. Quando há mais tipos de dados de tamanho fixo (como Datetime2, int, decimal e char), utilize o nível de compressão por linha.

Compressão a nível de pagina inclui a compressão a nível de linha e utiliza um dicionário de paginas com os prefixos das colunas a fim de evitar redundância de dados. Considerando o exemplo abaixo:

Linha 01 | Andressa Martins

Linha 02 | Lucas Romão

Linha 03 | Andressa Martins

 

Utilizando o dicionário de pagina os dados serão armazenados assim:

Linha 01 | Andressa Martins

Linha 02 | Lucas Romão

Linha 03 | 01

 

[]’s

Andressa Alves Martins

Twitter: Dre_Martins Skype: Dre.alvesm

Blog: http://sqlgo.wordpress.com

Anúncios