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 / 1466
Accepted
damusnet
damusnet
Asked: 2011-02-28 08:14:07 +0800 CST2011-02-28 08:14:07 +0800 CST 2011-02-28 08:14:07 +0800 CST

Quão errado está meu esquema de modelagem de aplicativo da web?

  • 772

Então, estou prestes a escrever um aplicativo da Web bastante simples, atualmente estou trabalhando ativamente no esquema do banco de dados e preciso de ajuda para evitar grandes inconvenientes. Eu programo (php) há alguns anos, mas nunca tive nenhuma formação teórica, então sou totalmente ignorante sobre as melhores práticas de banco de dados e gostaria muito de aprender mais.

O problema é o seguinte: o aplicativo vai ser um CMS bem básico que permite armazenar postagens de blogs, eventos, galerias de fotos e outros itens diversos. Agora todos esses itens compartilham os mesmos atributos (mais ou menos, mas digamos que sim) que são user_id, title, date, content. Além disso, todos eles podem ser "comentados", "favoritos", "compartilhados" etc. E, finalmente, podem ser vinculados entre si (um post de blog pode se referir a um evento, que tenha fotos, etc.). Por causa disso, fico tentado a criar apenas uma tabela chamada "itens" e ter um campo "tipo" para diferenciar os itens. A consequência seria ter apenas uma tabela "join" para cada ação: "users_comments", "users_favorites", etc. e uma tabela de junção para conexões de itens entre si. Em última análise, pode haver mais tipos de itens no futuro...

Eu meio que sinto que esse é um caminho ruim e preguiçoso, principalmente por causa do desempenho, mas eu realmente gostaria de ter sua opinião sobre isso. O efeito de bloqueio tornará o site totalmente inútil, pois várias pessoas tentarão ler e escrever esses "itens"? Por que vale a pena, estou usando MySQL com MyIsam e CakePHP.

Além dessa questão está o fato de não estar acostumado com aplicações de grande escala e sempre me questionar sobre o desempenho. Acabei de ler sobre 3NF e vou continuar aprendendo essas coisas, então qualquer dica de leitura seria muito apreciada.

mysql schema
  • 2 2 respostas
  • 854 Views

2 respostas

  • Voted
  1. Best Answer
    BillThor
    2011-03-03T13:36:56+08:002011-03-03T13:36:56+08:00

    Olhe seriamente para a terceira forma normal. Eu usaria chaves substitutas com as chaves naturais implementadas como chaves exclusivas. Você provavelmente descobrirá que o autor pertence à sua própria tabela de autores. Você pode descobrir que tem algumas tabelas bastante semelhantes, como user_content_faves, user_author_faves, user_author_shares. Isto é normal.

    Ter uma única tabela de conteúdo com uma coluna content_type pode ser apropriado. A coluna de conteúdo precisaria ser capaz de armazenar todos os tipos de conteúdo.

    EDIT: Para tabelas de relacionamento, geralmente nomeio a tabela de junção concatenando os nomes das tabelas unidas, abreviando conforme necessário. Se houver vários relacionamentos entre as duas tabelas, eu uso uma das duas opções:

    • Acrescente o propósito do relacionamento (como fiz acima); ou
    • Adicione um código de tipo/razão ao relacionamento (nesse caso, o tipo não é necessário no nome do relacionamento).

    Presumi que você gostaria de rastrear quem favoritou ou compartilhou coisas. Verifica-se que tanto o produtor (autor ou usuário) quanto os itens de conteúdo. Portanto, você tem usuários favorecendo um produtor (user_author_faves agora user_user_faves) ou um produto (user_content_faves). Dependendo de como você compartilha,

    • pode ser um atributo no conteúdo ou
    • um relacionamento como user_content_shares, em que o conteúdo é compartilhado com um usuário específico. O novo compartilhamento pode ser problemático, se você rastrear quem compartilhou as coisas e vários usuários compartilharem o mesmo conteúdo com o mesmo usuário. Descompartilhar itens compartilhados é problemático se você não rastrear quem fez o compartilhamento.

    Você pode querer considerar (e definir políticas para):

    • informações de rastreamento/auditoria, como quando algo foi feito (adicionado, favorito, compartilhado etc.).
    • se deve fazer exclusões físicas ou lógicas.
    • se você fizer exclusões lógicas, como lidar com o refavorecimento ou compartilhamento de algo após uma exclusão lógica.

    Ao indexar tabelas de relacionamento, geralmente tenho a chave primária que consiste nas chaves primárias das duas tabelas que estão sendo unidas. Um segundo índice com as chaves primárias invertidas, ou apenas a chave primária, que é a segunda coluna da chave primária, geralmente é necessário. Se o relacionamento entre duas linhas puder ocorrer mais de uma vez, a(s) coluna(s) usada(s) para diferenciar o motivo/tipo e/ou tempo (desde a data) do relacionamento precisa(m) ser adicionada(s) à chave primária.

    • 4
  2. user1098
    2011-03-04T06:58:45+08:002011-03-04T06:58:45+08:00

    Criar tabelas genéricas com, por exemplo, colunas discriminadoras como você parece sugerir é uma prática possível, mas um tanto tediosa ao usar um RDBMS - embora algumas estruturas ORM tenham um suporte muito bom para isso. No entanto, isso definitivamente causará um impacto no desempenho. Parece que você está procurando um modelo hierárquico em vez de um modelo relacional. Talvez um banco de dados não relacional/de documentos seja mais adequado às suas necessidades, para fornecer flexibilidade suficiente para adicionar "tipos" no futuro.

    Além disso, se você insistir em usar o MySQL para esta situação, recomendo usar o InnoDB em vez do MyISAM. O MyISAM tem algumas desvantagens, como nenhum suporte de chave estrangeira real, bloqueio no nível da tabela, nenhuma recuperação de travamento, etc.

    • 0

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

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