Estou criando um banco de dados de resultados de simulação e estou tentando fazer isso da maneira certa. Eu tentei mostrar relacionamentos entre dados para garantir que nada redundante seja lançado.
Minha estrutura atual é assim:
Experimentar
Chave primária: SimulationID
Tabelas:
- medição
- taxa de amostragem
- first_draft_flow_rate
- second_draft_flow_rate
- final_flow_rate
Chave estrangeira relacionada a essas tabelas: cycle_count
Cada tabela contém a chave primária, a chave estrangeira e os valores das variáveis.
Portanto, para um determinado experimento, ele é executado por tantos ciclos (o número de ciclos varia de simulação para simulação). Registramos dados em cada ciclo da simulação.
Eu fiz uma tabela chamada measurement
, sampling_rate
, etc, mas não tenho certeza de como nomear as colunas. O também deve ser chamado measurement
, sampling_rate
, etc? Ou devo apenas usar Value
como o nome da coluna?
Aqui está uma planilha com um log de amostra para demonstrar com o que estou trabalhando. Todos esses dados seriam arquivados em um único arquivo SimulationID
.
Além disso, qualquer dica sobre a melhor forma de projetar um banco de dados para ser normal/melhores práticas seria muito apreciada.
Minha preferência seria nomear as colunas como
final_flow_rate__value
, etc, já quevalue
por si só pode se tornar muito confuso se houver várias colunas com esse nome.Tome por exemplo:
Os resultados mostrarão os títulos das colunas, todos dizendo apenas
value
.O seguinte retorna cabeçalhos de coluna que fazem mais sentido.:
Como um DBA encarregado de depurar o código de outras pessoas, eu odeio especialmente quando cada chave substituta em um banco de dados é nomeada
ID
na tabela referenciada exxx_ID
na tabela de referência. Por exemplo:Esse padrão leva a padrões difíceis de depurar, como:
Que de fato deveria ser:
Se as tabelas forem definidas como:
Com os mesmos nomes nas tabelas, esse bug quase NUNCA ocorrerá, já que a versão "errada" seria óbvia de detectar se implementada e provavelmente nunca seria implementada incorretamente em primeiro lugar:
A versão correta, que é imensamente mais legível, é:
As colunas que contêm o mesmo conteúdo nas tabelas devem ser nomeadas exatamente da mesma forma em todas as tabelas em que são definidas, apenas para reduzir o legado negativo.
Isso não é administração de banco de dados, é modelagem de dados. Disciplinas muito diferentes.
Suponho que sua entidade principal seja Simulação e as tabelas que você lista a descrevem. Você não mostra a estrutura ou o conteúdo dessas tabelas, portanto, o seguinte é baseado em conjecturas.
A medição parece ser uma lista de tipos de medição: temperatura, fluxo, partículas por unidade de volume, etc. SamplingRates também se parece com uma lista de taxas válidas: 1/seg, 10/seg, 100/seg, etc.
Finalmente, há três tabelas que parecem ser uma, FlowRates, que também é uma tabela de pesquisa.
Isso significaria que uma Simulação é o resultado registrado de, digamos, uma leitura de temperatura a uma taxa de 10 vezes por segundo de um fluxo de 30 ml/s.
Isso é preciso? Se for, segue um exemplo:
Portanto, a entrada de Simulação de exemplo mostraria uma Medição de 1, SamplingRate de 2 e FlowRate de 3 -- juntamente com os resultados da medição, é claro, e provavelmente um registro de data e hora de quando a simulação foi realizada.
Ajudaria muito se você desse uma descrição em linguagem simples de um experimento: "Um experimento consiste em qualquer número de simulações. Uma simulação é composta de várias leituras de... feitas em uma certa frequência com base em ..." Não pense em termos de tabelas e colunas. Finja que está falando com um técnico de laboratório.
Atualização: ao projetar uma tabela (e isso se refere à nomenclatura dos campos), geralmente é uma boa ideia isolar a entidade de todas as outras entidades -- ou seja, a nomenclatura deve ser feita da forma mais livre de contexto possível. O que isso significa é que, se você tiver um campo que representa, digamos, o nome ou a descrição da entidade, chame esses campos de "Nome" e "Descrição". Não importa que você tenha dezenas de outros campos com nomes idênticos em tabelas espalhadas pelo banco de dados.
Uma tabela não tem contexto. É a consulta que estabelece um contexto.
Aqui estão três tabelas, cada uma com o campo Name -- realmente não importa que uma tabela seja usada duas vezes. Dentro de cada tabela, Nome significa "este é o nome da entidade representada por esta linha".
O contexto estabelecido por esta consulta é facilmente identificado. Ele examina o proprietário e o gerente de todos os sites recém-criados e renomeia cada campo Nome para se adequar ao contexto. Consultas diferentes podem usar os campos em contextos completamente diferentes. Como é a consulta que define o contexto, deixe a consulta renomear os campos para o que melhor se adequar a esse contexto.
Não tente forçar um contexto com uma tabela nomeando os campos User_ID ou User_Name e assim por diante. Em uma consulta, os campos devem ser prefixados com o nome da tabela ou alias de qualquer maneira, para que nunca haja confusão.
Compare com
O extra "User_" não adiciona nenhuma informação útil. Além disso, você certamente encontrará algo assim:
Estou exausto apenas digitando uma vez. Além disso, alguns DBMSs limitam o tamanho dos nomes dos objetos. Oracle, iirc, considera apenas os primeiros 32 caracteres de um nome de objeto. Atingi esse limite mais de uma vez em lojas que usam a convenção tablename_fieldname . Nesse ponto, você deve usar abreviações, o que é realmente confuso.
De qualquer forma, "melhores práticas" é um conceito bastante subjetivo. As opiniões variam. Escolha o que for mais confortável para você.
Sempre tente pensar no futuro, use nomes de tabelas e campos que sejam autodocumentados (autoexplicativos) sempre que possível. Não basta juntar um monte de letras e assumir que a pessoa que vem atrás de você teria alguma ideia do que está olhando. Nomear coisas neste assunto também torna muito mais fácil ver quais resultados sua consulta está retornando.