2015-11-23 15:58 GMT-02:00 Sebastian Webber <sebast...@swebber.me>:
>
> Meu caro Dutra, segundo a doc[1], dá pra dizer que:
>
> CREATE DOMAIN creates a new domain. A domain is essentially a data type with
> optional constraints (restrictions on the allowed set of values) ...

Então, mais ou menos… esse é um ponto em que nossa documentação comete
um erro conceitual grosseiro.


> Domains are useful for abstracting common constraints on fields into a
> single location for maintenance.

Perfeito, mas não apenas.

O DOMAIN do SQL, que o PostgreSQL segue, não é domínio de verdade.
Creio que já (tentei) explicar isso aqui antes, mas como é um dos meus
assuntos favoritos, tentarei de novo:

Um domínio é uma lista de valores — conceitualmente, porque podem ser
valores contínuos (não discretos), caso em que a lista não pode ser
realizada; idem para domínios infinitos.  Um tipo de dados é um
domínio e seus operadores.

Por exemplo, no caso ‘em tela’ (jargão aqui de Brasília), um CPF é um
número de até onze caracteres, ou precisamente onze se o precedermos
de zeros.  Até onde eu saiba; perdoem alguma imprecisão no exemplo.  O
domínio CPF é constituído de todos os números de CPF válidos.  Como
apenas os nove números excluindo os dois dígitos verificadores à
direita são relevantes para gerar a lista, podemos dizer que o
domínio, a princípio, seria de 1 a 999.999.999, concatenados com os
respectivos dígitos verificadores.  No caso, suponho que 0 seja um
caso especial, ou seja, que não haja um CPF 0-XX onde XX seriam os DVs
correspondentes a 0.

Já o tipo de dados seriam os operadores correspondentes.  Não consigo
imaginar, de bate-pronto, algum operador que não seja o de identidade
(comparação para ver se é igual ou diferente); por exemplo, não me
parece fazer sentido querer concatenar, cortar, somar, subtrair,
multiplicar, dividir, comparar se maior ou menos &c.  Talvez
operadores para extrair os dígitos significativos (os nove excetuando
os DVs) e os dígitos verificadores.

O interessante a reter é que não faz sentido operar num determinado
domínio com operadores que não correspondam ao tipo.  Portanto, por
definição, uma definição de domínio tem de excluir operações de outros
tipos (por exemplo, concatenar ou multiplicar CPFs), ou que envolvam
outros domínios sem que sejam operações especificamente previstas para
o domínio em questão e outro domínio qualuqer (por exemplo, concatenar
um CPF com um CNPJ, ou multiplicar um CPF por um CNPJ).

Até onde já li e testei, um DOMAIN SQL não impede isso.  Teste; deve
ser possível CREATE TABLE cpf (cpf AS cpf);  com esse DOMAIN, e fazer
um SELECT cpf * 2 FROM cpf;, o que não seria possível com um domínio
de verdade.

Aproveitando para bater noutra tecla que me é cara, é por causa desse
tipo de problema de confusão conceitual (embora não desse problema
específico) que o SQL não é relacional: para começo de conversa, uma
tabela SQL não necessariamente é uma relação (que precisa de ao menos
uma chave natural), mas pode ser um saco (sem chave natural, ou seja,
não é um conjunto).


> For example, several tables might contain
> email address columns, all requiring the same CHECK constraint to verify the
> address syntax. Define a domain rather than setting up each table's
> constraint individually.

Ou seja, é útil mesmo sem ser um domínio: é um atalho para declarar
uma restrição de validação.


> Chamamos isso de empate técnico? :D
>
> [1] http://www.postgresql.org/docs/current/static/sql-createdomain.htm

Posso dizer que não é uma disputa, portanto não faz sentido falar em
empate?  ;-)


-- 
skype:leandro.gfc.dutra?chat      Yahoo!: ymsgr:sendIM?lgcdutra
+55 (61) 3546 7191              gTalk: xmpp:leand...@jabber.org
+55 (61) 9302 2691        ICQ/AIM: aim:GoIM?screenname=61287803
BRAZIL GMT−3  MSN: msnim:chat?contact=lean...@dutra.fastmail.fm
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a