Para domínio ou não para domínio

15

Os padrões SQL92 e SQL99 definem construções DDL . Nem todos os bancos de dados suportam isso ou têm um nome diferente (o SQL Server possui tipos definidos pelo usuário , por exemplo).CREATE DOMAIN

Eles permitem definir um tipo de dados restrito a ser usado em seu banco de dados, simplificar e impor regras pertencentes aos valores permitidos. Esse tipo de dados pode ser usado em declarações de coluna, em entradas e saídas de procedimentos e funções armazenados etc ...

Eu gostaria de saber:

  • As pessoas realmente usam domínios em seus designs de banco de dados?
  • Se assim for, em que medida?
  • Quão úteis eles são?
  • Que armadilhas você encontrou?

Estou tentando avaliar a viabilidade de usá-los no desenvolvimento futuro de banco de dados.

Oded
fonte
1
Eu também gostaria de saber isso ... Estou interessado em ouvir o que as pessoas têm a dizer.
maple_shaft

Respostas:

2

Como sempre...

Depende

Você tem uma entidade de domínio usada em mais de um local que dar suporte nativamente exigiria um esforço considerável e / ou restrições e comportamentos redundantes ?

Nesse caso, domínio ausente. Caso contrário, não se preocupe.

Eu achei necessário criar um tipo definido pelo usuário no SQL Server exatamente uma vez, com base na heurística acima. Eu nem me lembro o que era mais - mas economizou mais trabalho do que causou.

Steven A. Lowe
fonte
5

Como usuário do SQL Server e C #, não usei Tipos definidos pelo usuário no banco de dados, pois sou muito mais poderoso no lado do aplicativo. Evento após ORMs como LINQ to SQL e Entity Framework, meu uso dos recursos do servidor reduziu muito.

Por exemplo, eu estava usando a integração CLR para carregar algumas funções de conversão DateTime no SQL Server para transferir datas gregorianas para outros formatos, com base no poder de globalização do .NET. Mas agora, as coisas são diferentes, e eu não faço mais isso. Eu simplesmente carrego os dados e faço a transformação, diretamente na minha camada de aplicação.

Então, após quase 4 anos de programação e inspeção de todas as equipes em que consigo pensar, não encontrei nenhuma amostra do uso de Tipos Definidos pelo Usuário. Também não vi isso em ação em muitos blogs .NET.

Embora isso não signifique que as pessoas não usem o Domínio do Banco de Dados , certamente significa que pelo menos o uso do Domínio do Banco de Dados não é tão comum.

Saeed Neamati
fonte
"Eu não usei tipos definidos pelo usuário no banco de dados, pois sou muito mais poderoso no lado do aplicativo" : então você usa restrições? Eu não entendo, como é diferente do ponto de vista do aplicativo?
Arseni Mourzenko
@ MainMa, por exemplo, não crio classe Student na camada de banco de dados. Simplesmente crio uma tabela de alunos com todos os tipos de dados primitivos, como número inteiro e string, e, usando o ORM, mapeio qualquer registro para um objeto no aplicativo.
Saeed Neamati
Entendido. Você está certo.
Arseni Mourzenko 23/09/11
3

Já existe uma resposta detalhada no Stack Overflow. Eu concordo principalmente com isso, mas não com o exemplo dado, cito:

"Por exemplo, defino um" GenderType "(char (1), não anulável, mantendo" M "ou" F ") que garante que apenas os dados apropriados sejam permitidos no campo Gender".

Pessoalmente, me sinto mais à vontade definindo o char(1)tipo e definindo uma restrição na coluna. Quando a restrição é violada, eu sei exatamente onde procurar para encontrar o que fiz de errado. Também é mais conhecido do que os tipos definidos pelo usuário, portanto, o banco de dados que usa apenas restrições seria mais fácil de entender para um iniciante.

Claro, apenas é apenas uma opinião pessoal. Outras pessoas diriam que uma in ('M', 'F')restrição não é auto-documentada e pode ser muito obscura para um desenvolvedor novo que descobre o banco de dados.

Na IMO, use tipos definidos pelo usuário para tipos mais complicados e restrições para algo básico. Além disso, quando você não consegue encontrar facilmente um nome explícito para um tipo, há uma chance de que uma restrição caiba melhor.

Arseni Mourzenko
fonte
E os hermafroditas?
Wyatt Barnett
Ou intersex? Ou pessoas trans?
Broam 27/09/11
1

Eu não usei esse recurso, mas acho que você precisa se certificar de que:

  1. Se seu banco de dados for usado por um único sistema, pode fazer sentido não usar esse recurso e adicionar a lógica de verificação em sua camada de negócios ou equivalente. Isso lhe dará mais flexibilidade na validação (por exemplo, no uso de expressões regulares) e permitirá encapsular toda a lógica de validação em um único local. Se seu banco de dados for compartilhado por vários sistemas, você poderá usar gatilhos adequados para esta tarefa.

  2. Não tenho certeza se o UDT permite que você personalize as mensagens de erro retornadas ao cliente quando um erro de validação é encontrado.

  3. UDTs são muito úteis se a mesma regra de validação se aplicar a várias colunas. Na minha opinião, não vejo isso como um caso muito comum em aplicativos de negócios com design de banco de dados normalizado.

Você pode estar interessado em verificar "Qual é o objetivo dos tipos definidos pelo usuário [SQL Server]?" artigo do blog.

NoChance
fonte
1
+1 para o terceiro ponto. Escrever a mesma restrição repetidamente como eu não é a melhor coisa a fazer, especialmente quando a restrição pode mudar com o tempo, exigindo alterá-la em vários lugares.
Arseni Mourzenko 23/09/11
0

Quando você diz "nem todos os bancos de dados suportam isso", acho que a melhor maneira de colocá-lo é o seguinte:

Todo banco de dados importante suporta isso, pois oferece suporte a gatilhos, funções e outros recursos avançados extensivamente.

Isso nos leva à conclusão de que isso faz parte do SQL avançado e faz sentido em algum momento.

Do people actually use domains in their database designs?

O menos possível, devido à ampla cobertura necessária (considerando operadores, índices, etc.)

If so to what extent?

Novamente, por mais limitado que seja, se um tipo existente combinado com um pouco de lógica definida adicional (ou seja, verificações etc.) pode fazer o truque, por que ir tão longe?

How useful are they?

Muito. Vamos considerar por um segundo um DBMS não tão bom como o MySQL, que escolhi por este exemplo por um motivo: falta um bom suporte para o tipo inet (endereço IP).

Agora, você deseja escrever um aplicativo focado principalmente em dados IP, como intervalos e tudo mais, e se estiver preso ao tipo padrão e à sua funcionalidade limitada, escreverá funções e operadores adicionais (como os suportados originalmente no postgreSQL for exemplo) ou escreva consultas muito mais complexas para todas as funcionalidades necessárias.

Este é um caso em que você justificará facilmente o tempo gasto na definição de suas próprias funções (inet >> inet no PostgreSQL: range contido no operador range).

Nesse ponto, você já justificou a extensão do suporte ao tipo de dados; existe apenas uma outra etapa para definir um novo tipo de dados.

Agora, de volta ao PostgreSQL, que oferece suporte a tipos realmente agradáveis, mas não possui int. Não assinado ... o que você precisa, porque está realmente preocupado com armazenamento / desempenho (quem sabe ...), bem, você precisará adicioná-lo, bem como o operadores - embora, é claro, isso se deva principalmente aos operadores int existentes.

What pitfalls have you encountered?

Eu não brinco com isso até agora, não tive um projeto que exigisse e justificasse o tempo necessário para isso.

Os maiores problemas que consigo ver são reinventar a roda, introduzir bugs na camada "segura" (db), suporte incompleto ao tipo que você só perceberá meses depois quando o seu CONCAT (cast * AS varchar) falhar porque você não definiu uma conversão (newtype como varchar) etc.

Existem respostas que falam sobre "incomum" etc. Definitivamente, essas são e devem ser incomuns (caso contrário, o dbms carece de muitos tipos importantes), mas, por outro lado, deve-se lembrar que um (bom) db é compatível com ACID ( diferente de um aplicativo) e que qualquer coisa relacionada à consistência é melhor mantida lá.

Existem muitos casos em que a lógica de negócios é tratada na camada de software e isso pode ser feito no SQL, onde é mais seguro. Os desenvolvedores de aplicativos tendem a se sentir mais à vontade na camada de aplicativos e geralmente evitam melhores soluções implementadas no SQL; isso não deve ser considerado uma boa prática.

UDTs podem ser uma boa solução para otimização, um bom exemplo é dado em outra resposta sobre o tipo m / f usando char (1). Se tivesse sido uma UDT, poderia ser um booleano (a menos que desejemos oferecer a terceira e quarta opções). É claro que todos sabemos que isso não é realmente otimização por causa da sobrecarga da coluna, mas a possibilidade existe.

Morg.
fonte
O recurso específico (DOMAINs) não é suportado por todos os bancos de dados. Sim, usando gatilhos, restrições e funções, você pode emulá- lo, mas isso não o torna um recurso suportado.
Oded
Todo banco de dados importante suporta isso, pois oferece suporte a gatilhos, funções e outros recursos avançados extensivamente. Alguns realmente com pouca luz / ruins não, e ninguém que os usa se importa, pois suas limitações se estendem muito mais do que tipos específicos de usuários;)
Morg.
0

No papel, UDTs são um ótimo conceito. Eles permitem que você normalize verdadeiramente seu banco de dados (por exemplo, quando você tem duas colunas que dependem uma da outra) e também encapsule qualquer lógica relacionada ao seu novo tipo.

Na prática, o preço que você paga (hoje) é muito alto. Obviamente, há uma sobrecarga de desenvolvimento, mas, além disso, você perde o suporte de uma variedade de ORM e ferramentas de relatório e aumenta bastante a complexidade geral da solução. Não há muitos desenvolvedores por aí que estejam intimamente familiarizados com UDTs, e nunca vi UDTs gerenciados usados ​​fora de exemplos.

Um dos melhores exemplos de um tipo que é melhor executado como UDT (se ainda não existia) teria que ser hierarchyid( link do MSDN ). Para manter a eficiência, ele armazena seu valor em um formato binário (em oposição às implementações personalizadas do varchar personalizadas), o que seria complicado de manter sem as funções do tipo. Os 10 métodos que o tipo fornece também são melhor fornecidos como parte do tipo, em oposição às funções externas. Eu consideraria o uso de UDT gerenciado personalizado em casos como este - onde há um ganho significativo, fornecendo uma implementação eficiente e organizada como um tipo separado.

Daniel B
fonte
0

Uma pergunta / resposta mais prática. Sua empresa permite usá-lo?

Sua empresa trabalha com várias marcas DBSQL que lidam com DDL (s) diferentes?

Cada marca de banco de dados pode oferecer bons recursos adicionais, como Tipos Definidos pelo Usuário, mas, se sua empresa usa vários bancos de dados, você pode ter problemas com os recursos não padrão.

Se a empresa é apenas você ou você pode decidir quais bancos de dados e recursos você usará, poderá usar o DDL

Tenho trabalhado com vários projetos em que um tipo definido pelo usuário pode ser útil, mas devo me ater a mais recursos padrão, pois tivemos que lidar com vários bancos de dados. (s)

umlcat
fonte