Pergunta

Eu estava discutindo com um desenvolvedor trabalhando sobre a questão de uma tabela usar valores padrão. Existe uma regra difícil e rápida sobre isso ou é uma área cinzenta nas melhores práticas?

Foi útil?

Solução

Minha regra: se muitos registros usarão esse padrão (pelo menos inicialmente), eu gosto de usá -lo como padrão. Por exemplo, uma tabela de imagens para produtos em uma loja online pode ter um caminho padrão de images/NoPictureYet.png. Eventualmente, eles serão substituídos, mas para muitos dados em que as imagens simplesmente ainda não existem (e talvez a maioria delas nunca haverá!), Um padrão faz sentido (pelo menos para mim).

Se não houver padrão sensato (como "primeiro nome" em um banco de dados de clientes - eu não quero que meu nome não fosse "nome do primeiro nome"), então o tornei não indicável e sem inadimplência - é responsabilidade do aplicativo garantir que isso um valor correto é inserido.

Mas não há regras rígidas e rápidas sobre isso. Tudo varia um pouco;)

Outras dicas

Um caso prático em que eu pessoalmente encontrei um bom uso de valores padrão é para um last_modified coluna.

Esta coluna nunca é atualizada por procedimentos armazenados ou lógica de negócios, mas é atualizada automaticamente por gatilhos quando qualquer valor na linha mudar. No entanto, também está definido como GETDATE() Por padrão, para que o valor de uma nova linha contenha o registro de data e hora de quando foi criado, que basicamente é quando foi modificado pela última vez.

ALTER TABLE users ADD CONSTRAINT dc_users_last_modified
                  DEFAULT GETDATE()
                  FOR last_modified;

O gatilho da atualização ficaria com algo assim:

CREATE TRIGGER trigUpdate_users 
ON users 
FOR UPDATE 
AS 
BEGIN 
    IF NOT UPDATE(last_modified) 
        UPDATE users SET last_modified = GETDATE() 
        WHERE user_id IN (SELECT user_id FROM inserted);
END 
GO

Nenhuma regra rígida e rápida pode ser aplicada. Depende das colunas. Pode ser totalmente sensato ter um tipo de pedido padrão, por exemplo, mas a idéia de um padrão para um número de telefone do cliente não faz sentido.

Eu diria que é uma área cinzenta. Normalmente, eu não projetava um novo banco de dados com muitos valores padrão, mas você geralmente precisa usá -los ao aprimorar um sistema existente.

Por exemplo, adicionando uma nova coluna não nula a um banco de dados existente. Você pode não querer (ou poder) atualizar todo o código que se insere nessa tabela, para que você precise colocar um padrão para garantir que qualquer código "legado" ainda possa inserir dados (assumindo que o valor padrão seja apropriado para o código legado, é claro).

Os valores padrão são importantes se a coluna deve ter um valor (não for nulo). De fato, se você estiver alterando uma coluna de permitir que os nulos não permitam que um valor padrão seja praticamente necessário, pois nem todo o código existente pode preencher um valor. Às vezes, neste caso, o valor padrão é algo como 'desconhecido'. Isso é especialmente verdadeiro se você quiser usar os valores com os valores padrão para exisitar registros onde o campo é nulo na declaração da tabela de alteradores que altera a coluna para não nulo

Os valores padrão são críticos para os campos com os quais a interface do usuário normalmente não lida. Por exemplo, temos valores padrão nas colunas date_inserted e user_inserted que o usuário nunca sabe que existem lá. Isso é especialmente crítico se muitos aplicativos diferentes puderam preencher os dados para garantir que ninguém esqueça essas colunas.

Depois, há colunas que normalmente recebem um valor na entrada de dados que podem mudar posteriormente. Coisas como uma coluna de status.

Muitas colunas não podem realmente ter um padrão. Qual seria o endereço ou o nome padrão de um usuário?

tl; dr: Os valores padrão são a lógica de negócios e eu quero a lógica de negócios no modelo de objeto. Como tal, um banco de dados não pode conter valores padrão.

Por exemplo, no banco de dados, tenho um campo um pouco: IsanicePerson. Este campo se traduz em uma propriedade na classe de pessoa. Sendo otimista por natureza, quero que o valor padrão para essa propriedade seja 'verdadeira'. Portanto, na classe Pessoa, implemento isso (como o valor padrão do campo de apoio de IsanicePerson). Se eu permitiria valores padrão no banco de dados, teria que duplicar essa lógica. O código/lógica duplicado é ruim. Daí minha objeção aos valores padrão.

Isenção de responsabilidade: eu moro em um mundo OO e uso Linq2SQL.

Deve ser bem simples. Se os dados geralmente devem ser exclusivos para cada linha, como o número de telefone do cliente ou o valor padrão provavelmente mudará com o tempo, eu não o usaria. Isso significa que é realmente útil apenas para preencher as colunas criadas, modificadas ou outras colunas dessa natureza.

Aqui estão as diretrizes que eu pessoalmente uso em relação aos valores padrão que me serviram bem no passado. Nos exemplos a seguir, considere um back -end de banco de dados com vários aplicativos com acesso de leitura/gravação ao back -end. Nesses casos, é essencial que o banco de dados defina como os dados devem ser modelados e, portanto, garantir a integridade dos dados.

1) colunas criadas e modificadas. Essas colunas normalmente terão getDate () (SQL Server) definidas como o padrão. Como mencionado em outras postagens, esses campos podem ser atualizados com gatilhos etc.

2) colunas estaduais booleanas. Exemplos: "Isdefault", "ISDELED" (para auditoria), "isactive", etc. Todos esses campos geralmente têm um estado padrão lógico que deve ser definido pelo modelo de dados. Exceções a isso obviamente seriam campos booleanos nulos, onde o estado nulo representa algo sobre os dados armazenados no registro.

3) Definições de restrição de dados: colunas com allownull = false e nenhum padrão definido. Em outras palavras, um valor é exigido pelo aplicativo.

4) Tabela de pesquisa Identidades de chave estrangeira: provavelmente não é a norma, mas para muitas chaves estrangeiras da tabela de pesquisa, definirei um padrão que cobre o estado inicial de um registro. Por exemplo, em uma tabela de "Evento", a coluna da chave estrangeira "EventTypeid" (int-AutoinCrement) terá o padrão 1 e representará "geral" ou algo assim. Isso abordará a maioria dos cenários em que, por exemplo, quero registrar um evento, mas não me importo com um ID de tipo específico.

5) Colunas de string não críticas: "Descrição", "Comentário" etc. Para essas colunas, geralmente definirei '' como o padrão puramente para simpificar System.dbnull => Manuseio de conversão nula em aplicativos. Isso é algo que pode não ser aplicável em todos os cenários, especialmente quando a tabela em questão contém milhões de linhas e o espaço de armazenamento é um problema.

Portanto, em resumo, use os padrões para garantir a integridade dos dados dos dados reais armazenados no banco de dados. O modelo de dados deve definir essas regras de integridade de dados dentro de si e qualquer aplicativo interagindo com ele e deve ser forçado a respeitar essas regras. Observe também que isso não é doutrina e que sempre haverá exceções. Considere cada cenário individualmente para que faça sentido para o seu banco de dados/aplicativo.

Definitivamente uma área cinzenta. É o clássico quanta lógica de negócios colocar na questão do banco de dados.

Se quiséssemos ser puristas e dizer que nenhuma lógica de negócios pertence ao banco de dados, a resposta nunca seria usá -los.

Sendo práticos, podemos fazer uma exceção como costumamos fazer e permitir a lógica de um padrão no banco de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top