AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 116513
Accepted
ijustlovemath
ijustlovemath
Asked: 2015-09-30 12:08:46 +0800 CST2015-09-30 12:08:46 +0800 CST 2015-09-30 12:08:46 +0800 CST

Nomenclatura de tabelas e normalização de banco de dados

  • 772

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 Valuecomo 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.

planilha

Além disso, qualquer dica sobre a melhor forma de projetar um banco de dados para ser normal/melhores práticas seria muito apreciada.

sql-server database-design
  • 3 3 respostas
  • 1850 Views

3 respostas

  • Voted
  1. Hannah Vernon
    2015-09-30T12:32:15+08:002015-09-30T12:32:15+08:00

    Minha preferência seria nomear as colunas como final_flow_rate__value, etc, já que valuepor si só pode se tornar muito confuso se houver várias colunas com esse nome.

    Tome por exemplo:

    SELECT 
        measurement.value
        sampling_rate.value
        first_draft_flow_rate.value
        second_draft_flow_rate.value
        final_flow_rate.value
    FROM 
        measurement
        INNER JOIN sampling_rate ON ...
        INNER JOIN first_draft_flow_rate ON ...
        INNER JOIN second_draft_flow_rate ON ...
        INNER JOIN final_flow_rate ON ...
    

    Os resultados mostrarão os títulos das colunas, todos dizendo apenas value.

    O seguinte retorna cabeçalhos de coluna que fazem mais sentido.:

    SELECT 
        measurement.measurement_value
        sampling_rate.sampling_rate_value
        first_draft_flow_rate.first_draft_flow_rate_value
        second_draft_flow_rate.second_draft_flow_rate_value
        final_flow_rate.final_flow_rate_value
    FROM 
        measurement
        INNER JOIN sampling_rate ON ...
        INNER JOIN first_draft_flow_rate ON ...
        INNER JOIN second_draft_flow_rate ON ...
        INNER JOIN final_flow_rate ON ...
    

    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 IDna tabela referenciada e xxx_IDna tabela de referência. Por exemplo:

    CREATE TABLE dbo.SomeTable
    (
        ID INT NOT NULL
            CONSTRAINT PK_SomeTable
            PRIMARY KEY CLUSTERED
        , ...
    );
    
    CREATE TABLE dbo.SomeOtherTable
    (
        ID INT NOT NULL
            CONSTRAINT PK_SomeOtherTable
            PRIMARY KEY CLUSTERED
        , SomeTable_ID INT NOT NULL
            CONSTRAINT FK_SomeOtherTable_SomeTable
            FOREIGN KEY REFERENCES dbo.SomeTable(ID)
        , ...
    );
    

    Esse padrão leva a padrões difíceis de depurar, como:

    SELECT SomeTableID = st.ID
        , SomeOtherTableID = sot.ID
    FROM dbo.SomeTable st
        INNER JOIN dbo.SomeOtherTable sot ON st.ID = sot.ID;
    

    Que de fato deveria ser:

    SELECT SomeTableID = st.ID
        , SomeOtherTableID = sot.ID
    FROM dbo.SomeTable st
        INNER JOIN dbo.SomeOtherTable sot ON st.ID = sot.SomeTable_ID;
    

    Se as tabelas forem definidas como:

    CREATE TABLE dbo.SomeTable
    (
        SomeTable_ID INT NOT NULL
            CONSTRAINT PK_SomeTable
            PRIMARY KEY CLUSTERED
        , ...
    );
    
    CREATE TABLE dbo.SomeOtherTable
    (
        SomeOtherTable_ID INT NOT NULL
            CONSTRAINT PK_SomeOtherTable
            PRIMARY KEY CLUSTERED
        , SomeTable_ID INT NOT NULL
            CONSTRAINT FK_SomeOtherTable_SomeTable
            FOREIGN KEY REFERENCES dbo.SomeTable(SomeTable_ID)
        , ...
    );
    

    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:

    SELECT st.SomeTable_ID
        , sot.SomeOtherTable_ID
    FROM dbo.SomeTable st
        INNER JOIN dbo.SomeOtherTable sot ON st.SomeTable_ID = sot.SomeOtherTable_ID;
    

    A versão correta, que é imensamente mais legível, é:

    SELECT st.SomeTable_ID
        , sot.SomeOtherTable_ID
    FROM dbo.SomeTable st
        INNER JOIN dbo.SomeOtherTable sot ON st.SomeTable_ID = sot.SomeTable_ID;
    

    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.

    • 2
  2. Best Answer
    TommCatt
    2015-10-01T10:54:50+08:002015-10-01T10:54:50+08:00

    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:

    Measurements
     ID  Name
      1  Temperature
      2  Particles per ml
    
    SamplingRates
     ID  Name  Period
      1     1     sec
      2    10     sec
    
    FlowRates
     ID  Rate  Unit Period
      1    10    ML    sec
      2    20    ML    sec
      2    30    ML    sec
    

    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.

    select  s.Name as NewSite, u1.Name as Owner, u2.Name as Manager
    from    Site s
    join    Users u1
        on  u1.ID = s.OwnerID
    join    Users u1
        on  u2.ID = s.MgrID
    where   s.Created > '2015-01-01';
    

    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.

    where  User.Name = 'John Smith'
    

    Compare com

    where  User.User_Name = 'John Smith'
    

    O extra "User_" não adiciona nenhuma informação útil. Além disso, você certamente encontrará algo assim:

    where ExtremelyLongTableName.ExtremelyLongTableName_SomewhatLongFieldName = ...
    

    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ê.

    • 2
  3. agpoweredmg
    2015-09-30T12:36:33+08:002015-09-30T12:36:33+08:00

    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.

    • 1

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve