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 / 193394
Accepted
Arthur Tarasov
Arthur Tarasov
Asked: 2017-12-19 03:45:08 +0800 CST2017-12-19 03:45:08 +0800 CST 2017-12-19 03:45:08 +0800 CST

É uma má prática ter vários relacionamentos individuais mutuamente exclusivos?

  • 772

Digamos que uma tabela cartenha um relacionamento um para um com tabelas electric_car, gas_care hybrid_car. Se a carfor electric_car, não poderá mais aparecer em gas_carou a hybrid_car, etc.

Há algo de errado com esse design? Alguns problemas que podem ocorrer no caminho?

database-design relations
  • 2 2 respostas
  • 11555 Views

2 respostas

  • Voted
  1. Best Answer
    Walter Mitty
    2017-12-19T05:32:01+08:002017-12-19T05:32:01+08:00

    Os diferentes tipos de carros são um exemplo de um problema geral que aparece repetidamente na modelagem de dados. É chamado de "generalização/especialização" na modelagem ER e "superclasse/subclasse" na modelagem de objetos.

    Um modelador de objetos usa os recursos de herança embutidos no modelo de objeto para resolver o problema com bastante facilidade. As subclasses simplesmente estendem a superclasse.

    O modelador relacional se depara com um problema. como projetar as tabelas de modo a emular os benefícios que se obteria da herança?

    A técnica mais simples é chamada de herança de tabela única . Os dados sobre todos os tipos de carros são agrupados em uma única tabela para carros. Existe uma coluna, car_type, que agrupa todos os carros de um único tipo. Nenhum carro pode pertencer a mais de um tipo. Se uma coluna for irrelevante para, digamos, carros elétricos, ela será deixada NULL nas linhas que pertencem a carros elétricos.

    Esta solução simples funciona bem para os casos menores e mais simples. A presença de muitos NULLs adiciona um pouco à sobrecarga de armazenamento e um pouco à sobrecarga de recuperação. O desenvolvedor pode ter que aprender a lógica de três valores SQL se os testes booleanos forem feitos em colunas anuláveis. Isso pode ser desconcertante no começo, mas a pessoa se acostuma.

    Existe outra técnica, chamada herança de tabela de classe . Nesse design, existem tabelas separadas para gas_car, electric_car e hybrid_car, além de uma tabela combinada, car, para todos eles. Quando você deseja todos os dados sobre um tipo específico de carro, você une a tabela de carros com a tabela especializada apropriada. Há menos NULLs neste design, mas você faz mais associações. Esta técnica funciona melhor nos casos maiores e mais complexos.

    Existe uma terceira técnica chamada chave primária compartilhada. Essa técnica é frequentemente usada em conjunto com herança de tabela de classe. As tabelas especializadas para as subclasses têm como chave primária uma cópia da chave primária da entrada correspondente na tabela carro. Essa coluna id pode ser declarada como chave primária e chave estrangeira.

    Isso envolve um pouco de programação extra quando novos carros devem ser adicionados, mas torna as junções simples, fáceis e rápidas.

    Superclasses e subclasses acontecem o tempo todo no mundo real. Não tenha medo. Mas teste seu design inicial quanto ao desempenho. Se sua primeira tentativa for simples e sólida, você poderá ajustá-la para acelerá-la.

    • 73
  2. Joel Brown
    2017-12-19T03:57:42+08:002017-12-19T03:57:42+08:00

    Não há nada de errado em ter tantos subtipos de entidade em seu modelo quantos forem necessários para refletir a realidade dos dados que você está tentando modelar. A questão não é se os subtipos são uma prática ruim. O problema pode ser é um bom modelo ?

    Por exemplo, no seu exemplo, o que você faz com algo como um Audi A4 eTron - que é um híbrido plug-in? Isso é um "carro elétrico" ou é um "carro híbrido"?

    A outra pergunta que você deve se perguntar é por que você está subdigitando? Quantos predicados distintos você tem em seus subtipos? Algum desses predicados é compartilhado entre subtipos? A situação pode se complicar.

    A subdigitação não é usada no design de banco de dados para classificação. Você pode fazer a classificação com códigos, chaves estrangeiras para tabelas de códigos ou com sinalizadores. A subtipagem é usada para modelar conjuntos de predicados distintos para diferentes tipos de algo de interesse. Se você estiver usando subtipos apenas para classificação, isso é uma prática ruim.

    Se seus subtipos modelam de forma clara e inequívoca diferentes conjuntos de predicados para as coisas com as quais seu banco de dados se preocupa, então é uma prática perfeitamente boa, independentemente de quantos subtipos você precisa.

    • 14

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