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 / 172281
Accepted
Daniel
Daniel
Asked: 2017-04-29 09:11:26 +0800 CST2017-04-29 09:11:26 +0800 CST 2017-04-29 09:11:26 +0800 CST

Se a sua tabela se chama Artigos, você nomeia sua coluna como número_artigo ou simplesmente número?

  • 772

Uma pergunta que me faço com bastante frequência é: Se minha tabela é nomeada articles, devo nomear minha coluna article_numberou simplesmente number?

Existe uma boa prática? Existe alguma diferença se você cria tabelas e colunas em um banco de dados, ou trabalha em uma camada abstrata como um ORM, onde a consulta talvez seja

a = Article.get(1);
my_num = a.number;
// or 
my_num2 = a.article_number
database-design
  • 3 3 respostas
  • 128 Views

3 respostas

  • Voted
  1. CalZ
    2017-04-29T09:34:01+08:002017-04-29T09:34:01+08:00

    Eu faria article_id. É tentador apenas torná-lo "id", mas quando ele começa a se tornar um FK em outras tabelas, é bom ter a coluna com o mesmo nome em ambos os lados.

    • 2
  2. Best Answer
    Joel Brown
    2017-04-30T04:58:54+08:002017-04-30T04:58:54+08:00

    SQL emprega um conceito conhecido como integridade de nome de domínio , o que significa que os nomes dos objetos têm um escopo dado pelo seu contêiner.

    Os nomes das colunas devem ser exclusivos, mas apenas dentro do contexto da tabela que contém as colunas. Os nomes das tabelas devem ser exclusivos, mas apenas dentro do contexto do esquema que contém as tabelas, etc.

    Ao consultar colunas, você precisa fazer referência ao esquema, tabela e coluna em que está interessado, a menos que um ou mais deles possam ser inferidos. Ao escrever uma consulta, você precisa fazer referência às tabelas em sua consulta diretamente pelo nome ou usando um alias, por exemplo, Customer.ID ou C.ID do Cliente C, etc., a menos que sua consulta seja tão simples que faça referência apenas a um tabela.

    Houve um tempo em que havia um requisito técnico para exclusividade de todos os nomes de coluna, que se aplicava a bancos de dados ISAM antigos e a linguagens como COBOL nas décadas de 1960 e 1970. Isso foi arrastado sem uma boa razão para o dBase na década de 1980 e ficou como uma convenção nas eras do DBMS relacional e de objetos. Resista a essa convenção ultrapassada.

    Quando a mudança de arquivos simples e bancos de dados de rede para bancos de dados relacionais aconteceu nas décadas de 1970 e 1980, a ideia de unir tabelas era nova. Assim, algumas pessoas escolheram a convenção de que um nome único poderia ser repetido se uma coluna fosse uma referência a outra (ou seja, chaves estrangeiras). Esse conceito é chamado de "junção natural" e muitas pessoas ainda defendem isso.

    Eu não sou um fã de junções naturais porque exige que você, em última análise, jogue fora o conceito de integridade do nome de domínio e force a referência de coluna inteira no nome da coluna.

    O problema com as junções naturais é que você precisa ser hipócrita ou tornar os nomes das colunas longos e ilegíveis. Deixe-me ilustrar: pode parecer uma boa ideia que a chave primária da tabela Customer seja CustomerID. Em seguida, na tabela de faturas, sua chave estrangeira para o cliente também é chamada de CustomerID. Esta seria uma junção natural e tudo soa bem até agora. Aqui está o problema. E se sua convenção for ter uma coluna em cada tabela chamada LastUpdatedDate? Então você pretende unir todas as tabelas a todas as outras tabelas por LastUpdatedDate? Claro que não. Este é o absurdo das junções naturais. Para evitar esse absurdo, você precisaria inserir o nome da tabela no nome da coluna como um prefixo. No entanto, se você tiver vários esquemas em seu banco de dados, não poderá parar por aí. Você também precisa adicionar o esquema ao nome da coluna,

    Outro lugar onde as junções naturais são quebradas é quando você tem vários relacionamentos entre as mesmas duas tabelas. Você, se precisar de duas referências a Employee em sua tabela Invoice (Sold By e Approved By, por exemplo), não poderá chamá-las de EmployeeID.

    • 1
  3. TommCatt
    2017-04-29T17:44:12+08:002017-04-29T17:44:12+08:00

    Esta não é uma questão de "melhores práticas". As melhores práticas são métodos a serem usados ​​que você sabe que trarão o melhor desempenho do sistema. Os nomes dos campos não afetam em nada o desempenho. Os nomes de campo são estritamente o que você mais se sente confortável, embora muitas empresas codifiquem esses padrões em um documento em algum lugar. (E a maioria das empresas faz um trabalho tão ruim que às vezes sinto vontade de chorar. Mas essa é uma resposta para uma pergunta completamente diferente.)

    Suponho que por "minha coluna" você quer dizer a chave substituta. Minha preferência ao nomear um campo-chave substituto é simplesmente ID. Meu raciocínio é que o nome deve refletir o significado do campo e o significado de qualquer campo (como a definição de qualquer palavra) é determinado pelo contexto. Dentro de uma definição de tabela, o nome "ID" significa "este é o PK desta tabela".

    Então, quando estou olhando para os nomes das colunas de uma tabela e vejo "ID", sei que é o campo-chave substituto dessa tabela. Pode haver muitas colunas denominadas This_ID ou That_ID ou Other_ID. Se uma delas pode ser a chave para esta tabela e as outras chaves estrangeiras para outras tabelas, existe agora um pouco de ambiguidade nos nomes. Quando a chave desta tabela é ID e todos os outros campos XXX_ID são chaves estrangeiras, há menos ambiguidade.

    Sinto muito, mas a ideia de que você terá o mesmo nome em ambos os lados de uma definição de chave estrangeira é apenas um pensamento preguiçoso. Em primeiro lugar, você estará olhando para nomes de campo e não scripts de definição FK, então você não verá esses nomes emparelhados, de qualquer maneira. Em segundo lugar, os nomes não serão os mesmos de qualquer maneira. Se você tiver referências de chave estrangeira para, digamos, a tabela Employees, essas referências terão nomes como Mgr_ID, Lead_ID, ApprovedBy, CheckedInBy, CheckedOutBy, CreatedBy, UpdatedBy, etc. Muito poucas referências serão realmente nomeadas Employee_ID. Isso é verdade para a maioria das chaves estrangeiras.

    Essa resposta, é claro, se aplica apenas a chaves substitutas. As chaves primárias que são uma das chaves naturais serão nomeadas de acordo com o significado do atributo. VIN para a mesa Carros, SSN para a mesa Clientes e assim por diante. Mesmo esses campos terão nomes diferentes em outras tabelas: Rental_ID, AccountOwner, etc.

    Dê nomes aos campos que sejam significativos no contexto estabelecido pela própria tabela. Quando você observa a definição de uma chave substituta, ela não deve ter nenhum outro uso (definição) além de "chave primária desta tabela". Assim, para mim, o nome não deve ser outro senão o "ID" genérico.

    • 0

relate perguntas

  • Os índices filtrados podem ajudar a melhorar as consultas baseadas em uma hora inserida ou isso deve ser evitado?

  • Qual é a diferença entre os tipos de dados MySQL VARCHAR e TEXT?

  • É melhor armazenar os valores calculados ou recalculá-los a pedido? [duplicado]

  • Armazenar vs calcular valores agregados

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

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