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 / 4152
Accepted
payling
payling
Asked: 2011-07-28 10:30:50 +0800 CST2011-07-28 10:30:50 +0800 CST 2011-07-28 10:30:50 +0800 CST

Criar ou não tabelas separadas para diferentes tipos de produtos?

  • 772

Estou no processo de projetar um banco de dados e estou tendo dúvidas sobre minhas decisões iniciais de design...

Os tipos de produtos são os seguintes... Modelos, peças, kits de peças de reposição e opções.

Opção A (primeiro projeto): planejei ter tabelas separadas para os tipos de produtos acima. Eu diria que cerca de 75% dos campos seriam iguais em cada tabela.

Criei cada tipo de produto como tabelas separadas por causa das associações que preciso criar entre eles. Por exemplo, um modelo pode ter muitas opções e uma opção pode ter muitos modelos. Uma opção também pode ter muitas partes e uma parte pode ter muitas opções... e assim por diante...

Opção B: Em vez de ter tabelas separadas, eu poderia criar uma tabela chamada Produto que engloba modelo, peça, kits de peças de reposição e opções. Eu poderia ter um campo chamado tipo para diferenciar entre modelo, opções, etc. Suponho que uma desvantagem é que vários campos nunca seriam usados ​​(deixados nulos) para determinados tipos de produtos. Eu estou supondo que é aqui que "não as melhores práticas" entrariam em jogo.

A opção B reduziria bastante a complexidade do design do banco de dados. Eu também não precisaria me preocupar em fazer referência a várias tabelas ao extrair dados para consultas ...

database-design database-recommendation
  • 4 4 respostas
  • 15119 Views

4 respostas

  • Voted
  1. Best Answer
    Derek Downey
    2011-07-28T11:59:44+08:002011-07-28T11:59:44+08:00

    Se essa fosse minha decisão de design, provavelmente escolheria mais uma 'Opção C' (opção a modificada).

    Primeiro, por que não 'Opção B':

    Por um lado, gosto da clareza que cada produto tem em sua própria mesa. Se for uma grande tabela com um campo para determinar o tipo, a relação não é tão clara.

    Por outro lado, a estratégia de indexação sempre exigiria que esse tipo de campo fosse listado. Como são apenas 4 tipos, a cardinalidade do índice é extremamente baixa ( SELECT * FROM product_table WHERE type='X'é basicamente fazer uma varredura completa da tabela)

    Opção C

    • Crie uma tabela pai que contenha apenas as colunas que todos os tipos compartilham
    • Crie cada tipo de produto como sua própria tabela com suas colunas individuais, com um extra: um link para a tabela pai
    • Crie cada tabela 'link': Product_Option, Model_option, etc com links para as respectivas chaves.
    • Para aqueles com links recíprocos (MODEL_OPTION, OPTION_MODEL), vá em frente e crie essas tabelas também. Isso adicionará clareza às suas uniões para quem estiver olhando.

    A desvantagem é a complexidade de evitar órfãos quando as coisas são atualizadas/excluídas e, inicialmente, projetar as consultas que usam essas tabelas.

    • 9
  2. Mark Storey-Smith
    2011-07-28T11:09:37+08:002011-07-28T11:09:37+08:00

    Sugiro que você comece com o modelo relacional "correto", sua opção A. Se o uso típico desse modelo o levar à desnormalização em algumas áreas, não tenha medo de fazê-lo.

    Eu estava discutindo com um colega na semana passada como os projetos de esquema são frequentemente considerados como algo que está gravado em pedra e nunca pode mudar. Estranho, considerando como a refatoração é uma prática aceita em todas as outras camadas de um aplicativo, que a refatoração de um esquema de banco de dados ainda seja vista como impraticável.

    Se a interface para o banco de dados for bem projetada, nada impedirá que você adapte o esquema à medida que aprende mais sobre os padrões de uso do sistema.

    • 7
  3. Michael Riley - AKA Gunny
    2011-07-29T09:22:45+08:002011-07-29T09:22:45+08:00

    Isso soa muito semelhante à hierarquia de listas de materiais/múltiplas cardinalidades que Paul Neilsen descreve no capítulo 17 da Bíblia do SQL Server 2008 .

    O capítulo inteiro é uma leitura muito boa e a seção específica que aborda o problema de muitos para muitos é encontrada nas páginas 416-419.

    Esta é a melhor discussão que já vi sobre o tipo de projeto de dados de peças explodidas .

    • 2
  4. Alan McBee
    2011-07-28T10:45:37+08:002011-07-28T10:45:37+08:00

    Se você puder imaginar um cenário provável em que haveria consultas frequentes em todos os quatro tipos de produtos (e isso parece provável para mim), sua opção B é a melhor.

    Em vez de deixar muitos campos anuláveis ​​não utilizados na tabela Product, por que não adicionar uma tabela ModelProduct, uma tabela PartProduct, uma tabela ReplacementPartKitProduct e ter apenas os campos que são distintos para esses tipos nessas tabelas? Use a mesma chave primária nessas tabelas como sua tabela de produtos. Junte-se à tabela Product e ModelProduct quando quiser trabalhar com modelos. Precisa determinar se o registro do produto que você possui é uma peça? Basta fazer uma junção à esquerda de Product para PartProduct e, se PartProduct.[PrimaryKey] não for nulo, você terá uma peça. Se for nulo, não é uma Parte. Como alternativa, você pode adicionar um campo ProductType à tabela Product.

    • 0

relate perguntas

  • 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 bancos de dados são recomendados para serem usados ​​como bancos de dados integrados?

  • 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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

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

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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