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 / 90137
Accepted
Louis Somers
Louis Somers
Asked: 2015-01-26 15:08:11 +0800 CST2015-01-26 15:08:11 +0800 CST 2015-01-26 15:08:11 +0800 CST

Normalizando entidades compartilhadas e aplicando restrições

  • 772

Estou procurando uma "melhor prática" ou "padrão" específica sobre entidades que são compartilhadas entre diferentes entidades, tendo uma relação com uma de muitas.

Por exemplo, pode-se ter a entidade genérica "Endereço", que poderia ser utilizada para armazenar os campos de endereços comuns para clientes, fornecedores, funcionários, etc...

Um DBA experiente seguiria esse caminho ou preferiria adicionar os campos às entidades correspondentes? Também estou pensando em manutenção, restrições que podem (no futuro) diferir dependendo da entidade, coisas assim.

Eu adoraria obter referências a qualquer trabalho autoritário ou estabelecido sobre o assunto.

database-design normalization
  • 2 2 respostas
  • 1071 Views

2 respostas

  • Voted
  1. Joel Brown
    2015-01-27T05:04:29+08:002015-01-27T05:04:29+08:00

    A motivação para empilhar todo tipo de endereço em uma única tabela geralmente é uma má interpretação e aplicação incorreta da noção de reutilização de código.

    As pessoas podem cometer o erro de presumir que, como você tem duas entidades com algum conjunto comum de atributos, esses atributos pertencem à sua própria tabela. Às vezes, as entidades têm colunas semelhantes ou idênticas coincidentemente . Ninguém criaria uma tabela para cada NAMEou em seu banco DESCRIPTIONde EFFECTIVE_DATEdados, pelo menos espero que não seja tentado a fazer isso.

    Algumas pessoas se referem erroneamente a todas as instâncias de remoção de colunas de suas próprias tabelas como normalização . A normalização envolve a remoção de colunas para suas próprias tabelas, mas nem todas as instâncias de remoção de colunas dessa maneira são realmente normalização. A normalização prescreve razões muito específicas para remover colunas de uma tabela. Se nenhum desses motivos for aplicável, você não está normalizando, está apenas complicando as coisas.

    Você tem duas maneiras corretas de pensar sobre isso: ou todos os seus endereços pertencem a uma pilha porque você tem um supertipo de entidade que incorpora todos os recursos comuns de vários subtipos de entidade, incluindo endereços, - ou - seus endereços pertencem a pilhas separadas (tabelas) de acordo com cada tipo de coisa que possui um endereço e você escreve seu código de procedimento em uma interface IAddress que é implementada para cada tabela de endereços.

    Se você realmente tem um supertipo de entidade, digamos LEGAL_ENTITYque tenha subtipos como CUSTOMER, VENDOR, EMPLOYEEe assim por diante, então ter uma ADDRESStabela que é filha de LEGAL_ENTITYé uma abordagem legítima. Pode até ser uma abordagem valiosa se houver uma sobreposição significativa entre seus clientes, fornecedores, funcionários (ou o que quer que você esteja rastreando), porque você pode alterar os endereços uma vez em vez de vários locais quando uma entidade legal se move. Por outro lado, se você não tiver esse supertipo, enfrentará os problemas apontados por Richard Tallent.

    Se você mantiver seus endereços em tabelas diferentes de acordo com o tipo de entidade que possui o endereço, ainda poderá obter a reutilização de código, assumindo que o idioma que você está usando oferece suporte a interfaces.

    Como um aparte: tvCa apontou em um comentário que os endereços podem ser armazenados como colunas em vez de linhas em uma tabela separada. Isso dependerá muito de quantos endereços você precisa para cada entidade. Se você estiver rastreando dois endereços (físico, postal) ou se estiver armazenando o histórico de endereços, use uma tabela de endereços. Se você armazenar apenas um endereço por destinatário, uma tabela separada provavelmente será um exagero.

    • 5
  2. Best Answer
    richardtallent
    2015-01-27T00:00:44+08:002015-01-27T00:00:44+08:00

    Não posso apontar nada confiável, mas se você pensar nos detalhes de tal implementação, as possíveis desvantagens são evidentes.

    Ter uma tabela subsidiária "compartilhada" é problemático principalmente porque se duas tabelas "pai" (digamos, Customere Employee) utilizam a mesma Addresstabela para armazenar endereços, você não pode usar uma restrição de chave estrangeira para garantir a integridade referencial entre os registros de endereço e o registros pais correspondentes.

    Mesmo se você renunciar ao uso de restrições de chave estrangeira, terá alguns problemas ao configurar suas colunas de chave estrangeira. Você basicamente tem três opções, nenhuma das quais é ideal:

    1. Coloque um AddressIDcampo nas tabelas Cliente e Funcionário. Os problemas aqui são (1) você não pode garantir que um endereço não será usado mais de uma vez e (2) se AddressIDfor atribuído automaticamente, você não poderá armazenar o endereço na tabela Cliente/Funcionário até que o Endereço é criado, que é o contrário de como você provavelmente deseja inserir os registros ( ou seja , torna Addressa tabela "pai").

    2. Coloque CustomerIDe EmployeeIDcolunas na Addresstabela. Os problemas aqui incluem (1) novamente, você não pode garantir o uso duplo de um endereço, (2) desperdiça espaço, pois está armazenando um NULL em uma coluna ou outra e (3) não escala bem conforme você encontra mais entidades que precisam de endereços.

    3. Recolher CustomerID/EmployeeID/etc. em uma única coluna ParentIDe outra coluna ParentTypeIDque se distingue Customersde Employees. Isso é melhor dimensionado do que (2) acima, mas tem seus próprios problemas, como a necessidade de atribuir "números mágicos" às tabelas pai para o arquivo ParentTypeID.

    Eu não vou dizer que não há lugares onde tais abordagens não são pragmáticas, mas você tem que considerar se é realmente tão importante ter colunas semelhantes em várias tabelas, e se tentar movê-las para uma tabela comum realmente compra qualquer coisa para o aumento da complexidade em inserções, atualizações, junções, etc. IMHO, geralmente é melhor cada tabela ter restrições claras em como elas se relacionam com outras tabelas e para as tabelas "pai" representarem os principais objetos de negócios que estão sendo criados (clientes, funcionários, etc.), não tipos complexos subsidiários que são comuns a várias outras tabelas.

    • 4

relate perguntas

  • É 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?

  • As formas normalizadas superiores sempre atendem aos critérios das inferiores?

  • Recursos de exercícios de normalização

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