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 / 168590
Accepted
user2652379
user2652379
Asked: 2017-03-30 17:28:33 +0800 CST2017-03-30 17:28:33 +0800 CST 2017-03-30 17:28:33 +0800 CST

Não usar restrições de chave estrangeira na prática real. Está tudo bem? [duplicado]

  • 772
Essa pergunta já tem respostas aqui :
Restrições de integridade em um banco de dados relacional - devemos ignorá-las? (3 respostas)
Onde você deve definir chaves estrangeiras? (4 respostas)
Fechado há 5 anos .

Não usar restrições FK é a regra incontável da minha empresa. As restrições FK são usadas apenas ao projetar ERD e não ao criar tabelas.

De acordo com meu sênior, na prática, esses são obstáculos que consomem muito tempo quando estamos lidando com questões urgentes. Ele diz que quando precisamos usar instruções INSERT/UPDATE/DELETE imediatamente, as restrições bloqueiam a execução dessas instruções e escrever instruções enquanto mantém as restrições também consome tempo. Eu até ouvi que muitas outras empresas estão fazendo isso.

Embora eu entenda as dificuldades, não tenho certeza se essa é uma boa maneira, pois é bem oposta ao meu entendimento do DB. Essa empresa é meu primeiro emprego também, então não sei como outras empresas lidam com isso.

De forma prática, qual é a sua opinião sobre isso? Isso pode ser justificado? Existem maneiras melhores? Como outras empresas estão fazendo sobre este assunto?

ATUALIZAÇÃO: Parece que é uma abordagem bastante comum para empresas sul-coreanas. Perguntei a alguns outros seniores que trabalharam para outras empresas, e a maioria deles está dizendo que todos estão fazendo assim. E até um deles trabalhava para uma empresa financeira! Interessante...

database-design foreign-key
  • 4 4 respostas
  • 27102 Views

4 respostas

  • Voted
  1. Best Answer
    Michael Green
    2017-03-30T21:13:31+08:002017-03-30T21:13:31+08:00

    Nada é gratuito. Às vezes, não ter algo também não é de graça. Tanto ter como não ter declarado chaves estrangeiras traz custos e benefícios.

    O objetivo de uma chave estrangeira (FK) é garantir que esta coluna aqui só possa ter valores que venham daquela coluna ali 1 . Dessa forma, podemos ter certeza de que apenas capturamos pedidos para clientes que realmente existem, para produtos que realmente produzimos e vendemos. Muita gente acha que isso é uma boa ideia.

    A razão pela qual os declaramos dentro do DBMS é para que ele possa cuidar de aplicá-los. Nunca permitirá a entrada de quaisquer dados que infrinjam as regras. Além disso, nunca permitirá que você se livre dos dados necessários para fazer cumprir as regras. Ao delegar essa tarefa à máquina, podemos ter confiança na integridade dos dados, não importa qual seja sua origem, quando foi escrito ou por qual aplicativo veio. Claro que isso tem um custo. O SGBD tem que verificar se as regras estão sendo seguidas, para cada linha, para cada consulta, o tempo todo. Isso leva tempo e esforço, que é uma carga no servidor. Também exige que os humanos enviem DML em uma sequência que respeite as regras. Chega de forçar um pedido astutamente e depois conversar com o administrador. Oh não humano impertinente, você deve primeiro criar o Cliente,

    Sem chaves estrangeiras, somos muito mais livres com o que podemos fazer e com a ordem em que podemos fazê-lo. As linhas problemáticas podem ser removidas ad hoc para permitir a conclusão de processos críticos. Os dados podem ser corrigidos depois, quando o pânico acabar. Os INSERTs geralmente são um pouco mais rápidos (o que aumenta com o tempo) porque nenhuma verificação de FKs é feita. Subconjuntos arbitrários de dados podem ser extraídos do banco de dados conforme desejado sem ter que garantir que todos os dados de suporte sejam incluídos. E assim por diante. Isso pode ser absolutamente bom se as pessoas envolvidas conhecerem o sistema, tomarem notas cuidadosas, tiverem boas rotinas de reconciliação, entenderem as consequências e tiverem tempo para se arrumarem. O custo é que algo, em algum lugar, é perdido uma vez e o banco de dados se deteriora em um lixo pouco digno de crédito.

    Algumas equipes colocam as verificações no aplicativo e não no banco de dados. Novamente, isso pode funcionar. Parece-me, no entanto, que a carga total do servidor será praticamente a mesma (ou um pouco maior) com essa abordagem, mas o risco de esquecer algum check-in de um pouco de código em algum lugar é muito maior. Com DRI, a regra é comunicada ao computador uma vez e é aplicada para sempre. No código do aplicativo, ele deve ser reescrito a cada novo programa.

    Pelos meus dois centavos, sou a favor de chaves estrangeiras. Deixe os computadores fazerem o que são bons em fazer, como a verificação repetitiva de rotina de que os valores das colunas correspondem. Nós, humanos, podemos nos concentrar em sonhar com coisas novas e interessantes. Tendo assumido a responsabilidade por um sistema há alguns meses, estou adicionando FKs à maioria das tabelas. Há alguns, no entanto, onde eu não vou adicioná-los. É aqui que coletamos dados de fontes externas. O custo de rejeitar essas linhas é maior do que o custo de aceitar dados incorretos e corrigi-los posteriormente. Portanto, para essas poucas tabelas, não haverá chaves estrangeiras. Faço isso de olhos abertos, sabendo que temos monitoramento e procedimentos corretivos.

    1 Reconheço a existência de restrições de chave estrangeira de várias colunas.

    • 40
  2. Evan Carroll
    2017-03-30T17:37:53+08:002017-03-30T17:37:53+08:00

    Seu superior está repugnantemente errado. As restrições FK são uma linha de código para garantir a integridade dos dados. O que leva mais tempo,

    • literalmente uma linha de código em uma linguagem declarativa e, às vezes, menos, pois você pode adicionar chaves estrangeiras inline ao usar CREATEa tabela.
    • ou, para assumir a integridade e lidar com as desvantagens de suposições fracassadas.

    Não há razão para não usar restrições de chave estrangeira e usar um banco de dados relacional. Você tem dois trabalhos como SQL DBA:

    • Faça o esquema com DDL.
    • Esquema de acesso com DML.

    Se você não está garantindo a integridade de seus dados com o esquema, está simplesmente pulando parte do trabalho. A própria natureza de uma transação é garantir atomicamente tudo ou nada. Você deseja definir "todos" sem usar restrições de chave estrangeira? Isso é uma pita.

    CREATE TABLE foo ( int a PRIMARY KEY );
    CREATE TABLE bar ( int b REFERENCES foo );
    CREATE TABLE baz ( int b );
    

    Agora faça uma transação atômica para barebaz

    1. insere no foo.avalor (1). Falha se o valor existir.
    2. insere em outra tabela ( bar.bou baz.b) o mesmo valor, 1 e falha se o valor não existir em foo.a.

    Qual deles economiza tempo?

    • 3
  3. Walter Mitty
    2017-03-31T22:54:59+08:002017-03-31T22:54:59+08:00

    É quase sempre melhor declarar restrições de chave estrangeira do que usar chaves estrangeiras sem restrição no DBMS. A restrição de chave estrangeira mantém a integridade referencial, o que evita uma forma de corrupção de dados.

    A alternativa de impor a integridade referencial no nível do aplicativo quase sempre custa tanto ou mais em recursos do computador e esforço do programador quanto a restrição do DBMS custaria.

    A alternativa de não manter a integridade referencial geralmente leva a dados corrompidos e resultados não confiáveis.

    As chances são muito grandes de que a política do seu site tenha sido equivocada desde o início. Existem exceções para isso, mas são poucas e distantes entre si.

    • 3
  4. MrTCS
    2017-03-30T18:52:37+08:002017-03-30T18:52:37+08:00

    Isso é algo que realmente precisaria ser testado para sua própria situação, mas para fornecer a integridade dos dados de chaves estrangeiras ao excluir ou atualizar rapidamente os dados, você pode analisar em cascata.

    CREATE TABLE ChildTable (
        id INT NOT NULL IDENTITY(1,1), 
        parent_id INT,
        FOREIGN KEY (parent_id)
            REFERENCES parent(id)
            ON DELETE CASCADE
    );
    
    • 2

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