Decidir sobre uma estrutura de base de dados para assistente preços

votos
1

opção A

Estamos trabalhando em um pequeno projeto que requer um assistente de preços para tabelas personalizadas. (Sim, costume real mesas- o tipo que você comer. A partir daqui que eu vou chamá-los de mesas de cozinha para que não se confunda) eu vim com um modelo onde cada parte mesa da cozinha era um banco de dados tabela. Assim, o banco de dados ficou assim:

TableLineItem
-------------
ID
TableSizeID
TableEdgeWoodID
TableBaseID
Quantity

TableEdgeWoodID
---------------
ID
Name
MaterialUnitCost
LaborSetupHours
LaborWorkHours

Cada parte tem que ser capaz de calcular o seu preço. A maioria dos cálculos são muito semelhantes. Eu gostei desta estrutura, porque eu posso arrastá-lo para a direita no designer de LINQ to SQL, e ter todas as minhas classes geradas. (Menos de escrita código significa menos para manter ...) Eu, então, implementar uma interface custo calcular que só tem no tamanho da tabela. Tenho escrito alguns testes e isso funciona muito bem. Eu adicionado também adicionada uma tabela para filtrar partes na interface com base nas selecções anteriores. (Você não pode ter uma madeira especial com um acabamento particular.) Existe algum outro fora exceções no modelo, e eu tê-los codificado. Este modelo é muito rígida, e os requisitos de mudança mudaria o datamodel. (Por exemplo, se todas as tabelas de repente precisa guarda-chuvas.)

Opção B:

Depois de várias reuniões com os meus colegas (que provavelmente levou mais tempo do que deveria, considerando o tamanho do projeto), os meus colegas decidiram que preferem uma abordagem mais genérica. Algo assim:

Spec
----
SpecID
SpecTypeID
TableType_LookupID
Name
MaterialUnitCost
LaborSetupHours
LaborWorkHours

SpecType 
--------
SpecTypeID
ParentSpecType_SpecTypeID
IsCustomerOption
IsRequiredCustomerOption

etc ...

Esta é uma abordagem muito mais genérico que pode ser usado para construir qualquer produto. (Como, se eles começaram a vender cadeiras ...) Eu acho que isso iria demorar mais tempo para implementar, mas seria mais flexível no futuro. (Embora eu duvido que vamos voltar a esta.) Além disso, você perder algum referencial Integridade você precisaria gatilhos para impor que uma base da tabela não pode ser definida para uma mesa de madeira.

Questões:

  1. Que tipo de estrutura de banco de dados que você prefere? Sinta-se livre para sugerir o seu próprio.
  2. O que seria considerado uma boa prática? Se você tiver várias tabelas de banco de dados semelhantes, você criar a tabela 1 banco de dados com uma coluna do tipo, ou várias tabelas distintas? Suspeito que a resposta começa com Depende ...
  3. O que uma diferença de tempo estimado estar nas duas abordagens (1 semana, 1 dia, 150% mais, etc)

Desde já, obrigado. Deixe-me saber se você tiver quaisquer perguntas que eu possa atualizar esta.

Publicado 19/05/2009 em 16:50
fonte usuário
Em outras línguas...                            


5 respostas

votos
3

Eu não tenho tempo para uma resposta completa agora, mas eu vou jogar isso fora:

  • É geralmente uma má idéia para projetar um banco de dados com base na ferramenta de desenvolvimento que você está usando para codificar contra ela.
  • Você quer ser genérico para um ponto . Tabelas em um banco de dados deve representar algo e é possível fazê-lo muito genérico. Por exemplo, uma tabela chamada "Coisas" é provavelmente demasiado genérico.
  • Pode ser possível fazer restrições que vão além do que você espera. Seu exemplo de uma "base da tabela" com uma "mesa de madeira" não faz sentido para mim, mas se você pode expandir em um exemplo específico que alguém pode ser capaz de ajudar com isso.
  • Finalmente, se esta é uma pequena pedido de uma única loja, em seguida, seu projeto vai ter muito menos impacto sobre o resultado do projeto do que seria se você estivesse projetando para um aplicativo que seria muito utilizada e constantemente alterado. Isso remonta ao "muito genérico" comentário acima. É possível se exceder um sistema quando seu uso será mínimo e bem definida. Espero que faça sentido.

Dado o seu comentário abaixo sobre as bases de mesa e bosques, você poderia configurar uma tabela chamada TableAttributes (ou algo similar) e cada opção possível seria de um determinado tipo de atributo mesa. Você poderia, então, impor que qualquer opção só é usada para o atributo a que se aplica tudo por meio de chaves estrangeiras.

Respondeu 19/05/2009 em 17:11
fonte usuário

votos
3

Tendo sido travado para fora com muito mais frequência do que deveria, projetando estruturas db que conheci meus clientes especificações originais, mas que acabou por ser demasiado rígido, eu sempre ir para a abordagem mais flexível, mesmo que ele leva mais tempo para configurar.

Respondeu 19/05/2009 em 16:58
fonte usuário

votos
1

Opção B ..

Genérico é geralmente melhor do que específica. Software já está condenado a falhar ou atingir a sua capacidade por ele é projeto para um determinado conjunto de apenas tarefas. Se você construir algo genérico ele vai quebrar menos se abstraída com uma análise realista de onde ele pode ir. Contanto que você fique longe de excesso de abstração e sub-abstração, é provavelmente o ponto doce.

Neste caso, o ditado "menos código é mais" provavelmente ser desenhado em que você não teria que voltar e reescrevê-lo novamente.

Respondeu 19/05/2009 em 22:15
fonte usuário

votos
1

Aqui está o que a minha experiência me dizia:

  1. Que tipo de estrutura de banco de dados que você prefere? Sem dúvida, eu iria para a abordagem de um. Vá para a configuração mais simples que poderia funcionar. Se você adicionar complexidade, sempre se perguntar, qual o valor que terá para o cliente?
  2. O que seria considerado uma boa prática? Isso, de fato, depende, entre outros sobre o tamanho do projeto ea taxa esperada de mudança. Como regra geral, tabelas genéricas valem a pena quando você espera que o cliente ser a adição de novos tipos. Por exemplo, se seu cliente quer ser capaz de adicionar uma nova entidade "cor" para a mesa, você precisa de tabelas genéricas. Você não pode prever de antemão o que vai adicionar.
  3. O que seria uma diferença de hora prevista estar nas duas abordagens? Não sabendo o seu negócio, habilidade e ambiente, é impossível dar uma estimativa válida . A abordagem que você está confiante em codificação vai demorar menos tempo. Aqui, meu palpite seria abordagem # 1 poderia ser 5x-50x mais rápido. Tabelas genéricas são difíceis, tanto no banco de dados e do lado do cliente.
Respondeu 19/05/2009 em 22:11
fonte usuário

votos
1

Há uma tendência para o excesso de abstrato com projeto do esquema de banco de dados, porque o custo da mudança pode ser elevado. Eu mesmo, eu gosto de nomes de tabelas que são bastante descritivo. Eu muitas vezes equiparar projeto de esquema com design OO. Por exemplo, você normalmente não criar uma classe chamada coisa, você provavelmente chamá-lo de Produto, Mobiliário, ponto, algo que se relaciona com o seu negócio.

No esquema que você forneceu há uma mistura do resumo (especificação) eo específico (TableType_LookupID). Eu tenderia a equalizar o nível de abstração, então use entidades como:

ProductGroup (for the case where you have a product that is a collection of other products)
Product
ProductType
ProductDetail 
ProductDetailType
etc.
Respondeu 19/05/2009 em 17:06
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more