Em 23/11/15, Guimarães Faria Corcete DUTRA, Leandro<l...@dutras.org> escreveu:
> 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?  ;-)
>
>

Olá Dutra:

Não sei se existe CPF 0-XX mas o CNPJ do Banco de Brasil é:
00.000.000/0001-91

Que, pelas suas considerações, seria um domínio de 0 a 99999999
acrescido da filial, de 0001 a 9999, e dos DV.

Osvaldo
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a