Alguém pode recomendar padrões de codificação para TSQL?

9

Há muito tempo temos padrões de codificação para nosso código .Net e parece haver várias fontes respeitáveis ​​de idéias sobre como aplicá-las e que evoluem com o tempo.

Eu gostaria de poder reunir alguns padrões para o SQL que são escritos para uso por nossos produtos, mas parece não haver recursos disponíveis no consenso sobre o que determina o SQL bem escrito?

Rowland Shaw
fonte
11
Pinal Dave tem uma lista de padrões de codificação em seu site . Eles parecem uma base justa para um conjunto de padrões.
Will A
11
Há uma pergunta relacionada ao SO .
Scott Whitlock
11
@ Scott, que cobre apenas a identificação; nada sobre nomeação, o uso de cursores / procedimentos armazenados / opções de tipo de dados ou qualquer coisa que realmente afeta a qualidade do código ...
Rowland Shaw
11
exatamente, daí porque eu disse que estava "relacionado", não uma "duplicada".
21411 Scott Whitlock

Respostas:

6

Na minha experiência, as principais coisas que eu procuraria seriam:

  • Nomeação de tabela e coluna - verifique se você usa ID, Referência ou Número para colunas do tipo ID, singular ou plural para nomes (plurais são comuns para nomes de tabela - por exemplo, THINGS, singular para nomes de coluna - por exemplo, THING_ID). Para mim, as coisas mais importantes aqui são a consistência, que evita que as pessoas percam tempo (por exemplo, você não encontra erros de digitação em que alguém colocou THING como um nome de tabela porque você sabe intuitivamente que os nomes das tabelas nunca são singulares).

  • Todas as criações devem incluir uma gota (condicional ao objeto existente) como parte de seu arquivo. Você também pode querer incluir permissões de concessão, até você.

  • As seleções, atualizações, inserções e exclusões devem ter um nome de coluna, um nome de tabela e um cláusula where / order by cláusula por linha, para que possam ser comentados facilmente um de cada vez durante a depuração.

  • Prefixo para tipos de objetos, especialmente onde eles podem ser confundidos (portanto, v é a visualização mais importante). Não tenho certeza se ele ainda se aplica, mas costumava ser ineficiente para procedimentos armazenados diferentes dos procedimentos do sistema iniciarem sp_. Provavelmente, a melhor prática para diferenciá-los de qualquer maneira usp_ foi o que eu usei mais recentemente.

  • Um padrão indicando como o nome de um gatilho deve incluir se é para atualização / inserção / exclusão e a tabela à qual ele se aplica. Não tenho um padrão preferido, mas essas informações são críticas e devem ser fáceis de encontrar.

  • Padrão para propriedade de objetos em versões anteriores do SQL Server ou no esquema em que ele deve existir para 2005 e versões posteriores. É sua decisão o que é, mas você nunca deve adivinhar quem é o dono de algo / onde ele mora) e, sempre que possível, o esquema / proprietário deve ser incluído nos scripts CREATE para minimizar a possibilidade de criação incorreta.

  • Um indicador de que qualquer pessoa que use SELECT * será obrigada a beber um litro de sua própria urina.

  • A menos que haja uma razão realmente boa (que não inclua preguiça de sua parte), tenha, imponha e mantenha relações de chave primária / chave estrangeira desde o início. Afinal, é um banco de dados relacional, não um arquivo simples, e os registros órfãos tornarão sua vida de suporte um inferno em algum momento. Além disso, esteja ciente de que, se você não fizer isso agora, posso prometer que nunca conseguirá implementá-lo após o evento, porque é 10 vezes o trabalho depois que você tiver dados (o que será um pouco estragado porque você nunca aplicou os relacionamentos corretamente).

Tenho certeza de que perdi algo, mas para mim são eles que realmente oferecem benefícios reais em um número decente de situações.

Mas, como em todos os padrões, menos é mais. Quanto mais longos os seus padrões de codificação, menor a probabilidade de as pessoas os lerem e usarem. Depois que você passar por algumas páginas bem espaçadas, comece a tentar descartar as coisas que realmente não fazem diferença prática no mundo real, porque você está apenas reduzindo a chance de as pessoas fazerem isso.

EDIT: duas correções - incluindo esquemas na seção de propriedade, removendo uma dica incorreta sobre a contagem (*) - veja os comentários abaixo.

Jon Hopkins
fonte
11
Algumas escolhas estranhas ... "SELECIONAR CONTAGEM (*)" está ruim? Já ouviu falar de esquemas (que não é o mesmo que proprietário)? Seus outros são bons
gbn
11
@ Jon Hopkins - Eu sei por que é ruim usar SELECT *. Seria ótimo se você pudesse dizer por que usar SELECT COUNT (*) é ruim.
k25
11
@gbn @ k25 - Alguns anos atrás (2002?), eu tinha um DBA muito quente (*), mas pesquisando no Google em resposta às suas perguntas, parece que isso agora está desatualizado (se é que isso é verdade). sqlservercentral.com/articles/Performance+Tuning/adviceoncount/… (Registro obrigatório). Ela era primariamente uma Oracle DBA, por isso pode ter sido um problema genuíno, que ela supôs também ser um problema para o otimizador de SQL.
Jon Hopkins
11
@gbn - Sim, apesar de estar relativamente sem mãos desde que foram introduzidas, minha reação automática foi com os usuários. Vou atualizar a resposta para cobrir os esquemas.
Jon Hopkins
11
@gbn, @ k25 - Mais escavações na contagem (*). Aparentemente, esse era um problema no Oracle 7 e versões anteriores, corrigido no 8i e além. Não está claro se houve algum problema no SQL Server, mas certamente não existe mais. Meu DBA estava desatualizado.
Jon Hopkins
3

parece não haver recursos disponíveis no consenso sobre o que determina SQL bem escrito

Isso porque não há consenso. Apenas como exemplo, eu teria respostas diferentes para pelo menos metade dos itens da lista de Jon Hopkins e, com base na quantidade de detalhes em sua lista, é um palpite seguro de que ambos trabalhamos com bancos de dados para viver.

Dito isto, um padrão de codificação ainda é uma coisa boa a se ter, e um padrão que todos na equipe compreendem e concordam é uma coisa melhor, porque esse padrão provavelmente será seguido.

Larry Coleman
fonte
11
+1. Eu acho que o mais importante é que você tenha consistência entre sua equipe.
Dean Harding
11
por interesse, o que você faria de diferente? Eles são basicamente questões de gosto (layout e assim por diante) ou existem erros "difíceis"?
Jon Hopkins
11
@ Jon: sem erros, apenas coisas subjetivas, como nomes de tabelas singulares, ódio a gatilhos, etc. BTW, "SELECT *" está bem dentro de um "EXISTS ()".
Larry Coleman
11
exemplo justo (e eu o uso com EXISTS e não me forço a beber urina).
Jon Hopkins
1

Além da resposta de Jon Hopkins ...

  • Objetos internos e externos separados

    • IX, UQ, TRG, CK etc para restrições e índices etc.
    • minúsculas ou CapsCase para clientes, por exemplo, uspThing_Add
  • Para objetos internos, torne-os explícitos se "não padrão"

    • UQ = restrição exclusiva
    • UQC = restrição em cluster exclusiva
    • PK = chave primária
    • PKN = chave primária não clusterizada
    • IX = índice
    • IXU = índice exclusivo
    • IXC = índice em cluster
    • IXCU ou IXUC = índice clusterizado exclusivo
  • Use esquemas para simplificar nomeação + permissões. Exemplos:

    • Helper.xxx para procs internos
    • HelperFn.xxx para udfs
    • WebGUI.xxx para algum código de frente
    • Dados e / ou histórico e / ou preparo para tabelas
gbn
fonte