Projeto DB: mais tabelas vs menos mesas

votos
5

Digamos que eu queira criar um banco de dados para um site da comunidade com blogs, fotos, fóruns etc., uma maneira de fazer isso é de destacar o conceito de um post, como uma entrada de blog, um comentário no blog, uma foto, um comentário da foto, um post no fórum tudo pode ser pensado como um post. Então, eu poderia ter uma tabela chamada Post [PostID, PostType, Título, Corpo ....], o PostType vai dizer que tipo de post-it é.

Ou eu poderia projetar essa coisa toda com mais mesas, BlogPost, PhotoPost, ForumPost, e eu vou deixar Comentário apenas a sua própria tabela com uma coluna CommentType.

Ou ter uma tabela Post para todos os tipos de pós, mas tem uma mesa comentário separado.

Para ser completo eu estou usando ADO.NET Entity Framework para implementar o meu DAL.

Agora a pergunta quais são algumas das implicações se eu ir com qualquer rota descrita acima, que irá influenciar no meu desempenho DB e capacidade de gestão, design camada intermediária e cleaness código, desempenho EF etc.?

Muito obrigado!

Raio.

Publicado 15/12/2008 em 17:32
fonte usuário
Em outras línguas...                            


3 respostas

votos
5

Deixe-me perguntar-lhe isto:

O que acontece se dois anos a partir de agora você decidir adicionar um 'pós música' como um tipo de blog? Você tem que criar uma nova tabela para MusicPost, e então re-código de seu aplicativo para integrá-lo? Ou você preferiria fazer logon no seu painel de administração blog, adicionar um tipo de blog em uma caixa drop-down chamado 'Music', e estar em sua maneira alegre?

Neste caso, menos mesas!

Respondeu 15/12/2008 em 17:38
fonte usuário

votos
3

O problema é semelhante à questão de quão profundo sua hierarquia deve estar em um design OO.

Uma abordagem simples em termos OO seria ter uma classe base Poste as crianças para BlogPost, ForumPoste assim por diante. Commentou poderia ser um filho de Postou sua própria hierarquia, dependendo de suas necessidades.

Então como é que isto vai ser mapeado para DB tabelas é uma questão totalmente diferente. Este ensaio clássico por Scott Ambler lida com as diferentes estratégias de mapeamento e explica suas vantagens e desvantagens de uma forma bastante detalhada.

Respondeu 15/12/2008 em 17:59
fonte usuário

votos
4

Geralmente, a vida será mais fácil se você pode ter todas as mensagens em uma tabela:

  • menos se junta para executar
  • menos mesas para manter
  • atributos comuns não são repetidos entre tabelas
  • código mais genérico

No entanto, você pode executar em algumas questões:

  • se cada subtipo tem um monte de seus próprios atributos, você pode acabar com muitas colunas - talvez demais para o seu DBMS
  • se um subtipo tem um atributo (por exemplo, uma imagem armazenada) que é caro para seu DBMS para manter mesmo quando não utilizados, você pode não querer essa coluna em todas as linhas

Se você correr até um problema, você pode criar uma nova tabela apenas para os atributos específicos de que o pós subtipo - por exemplo:

create table posts (post_id number primary key, 
                    post_date date,
                    post_title ...); /* All the common attributes */

create table photo_post (post_id references posts, photograph ...);

Em muitos casos, nenhum desses problemas surgem e uma tabela única para todos será suficiente.

Eu não consigo pensar em nenhum mérito na criação de uma tabela distinta para cada subtipo.

Respondeu 15/12/2008 em 19:10
fonte usuário

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