Escolar Documentos
Profissional Documentos
Cultura Documentos
Fórum universitário
1. Apresentação do Problema
2. Problemas semelhantes
O uso de fóruns é bastante comum no ambiente web desde os anos 90 quando a intenet se
popularizou. Fóruns tem a caracteristica de possuir mais leituras do que escritas geralmente o que
tornam as consultas por resultados um ponto crítico do desempenho do sistema. O banco relacional
também é eficiente para o modelo de armazenamento de perguntas, respostas e usuários do fórum.
O stackoverflow é um web fórum bastante popular na internet e recebe um fluxo quase que
inteiramente de leituras frente aos de escrita. Para isso o sistema opera com um banco de dados
SQL Server com requisições em SQL usando a linguagem C#.
O Quora é outro fórum de grande popularidade na web, com os mias diversos temas o
website opera com um banco de dados MySQL com a possibilidade de migrar para noSQL
futuramente e requisições SQL, principalmente para leituras e buscas na base de dados e a
linguagem python realizando o backend da aplicação.
O Yahoo! Respostas é talvez um dos fóruns mais utilizados no Brasil e mais populares no
mundo recebendo milhões de leituras e milhares de escritas por dia. Como base das plataformas
Yahoo! É utilizado o PHP como linguagem de programação para realizar consultas SQL.
Com a análise dos principais fóruns já existentes é possível perceber que o noSQL ainda não
se tornou utilizado em fóruns e tabelas relacionais continuam sendo a base dos bancos de dados
destes sistemas. Outro ponto é o uso de requisições SQL puras na liguagem de programação para
acelerar as consultas, principlamente leituras. A linguagem utilizada por nós o PHP aparece como já
sendo utilizada por fóruns conhecidos e o MySQL, nosso banco de dados, também figura como
ferramenta de grandes web fóruns.
4. Objetos do problema
Usuário: Classe responsável por tratar dos dados do usuários tais como e-mail e senha necessários
os atributos para login e indentificação do nome e curso do usuário, sendo que para o cadastro é
necessário obrigatoriamente utilizar o e-mail institucional (@universidade.br por exemplo) para ser
reconhecido como membro da instituição seja aluno, professor ou funcionário.
Tópico: Classe a qual temos um tópico criado por um usuário e possui um atributo título (exemplo:
tópico RU).
Postagem: Classe que representa a postagem em si, possui como atributos o id do usuário que
postou e o id do tópico a qual pertence, além do seu conteúdo propriamente dito em texto.
Comentários: Classe de comentários do fórum, nos seus atributos consta o texto do comentário, o
id da postagem e o id do usuário de que postou.
5. Tabelas
Implementamos quatro tabelas para o sistema, cada uma inspirada nos objetos definidos na
seção anterior. Todas tabelas tem um ID que é inteiro e auto incrementado, além disso o ID não
pode ser nulo em nenhum caso assim como os demais atributos. O conteúdo das postagens é limita
a apenas 150 caracteres e o conteúdo do comentário é limitado a 100 caracteres não sendo possível
ultrapassar esses limites.
6. Relacionamentos
Como supracitado, todos as tabelas possuem chave ID e todos os ids funcionam como
chaves primárias da tabela. A tabela usuários tem chave primária para todas as outras três tabelas
tópicos, postagens e comentários. Pois, estão diretamente associadas a um usuário específico.
A tabela postagem também recebe uma chave estrangeira representando o id do usuário e
também o id do tópico a qual está inclusa a postagem. Assim como comentários possui além do id
do usuário que comenta o id também da postagem a qual pertence este comentário.
A consultas CRUD (criar, ler, alterar e remover) são as mais básicas do sistema:
# Create usuario
INSERT INTO `usuarios` (`nome`,`email`,`senha`,`curso`) VALUES (?,?,?,?)
# Read comentarios
SELECT * FROM `comentarios` WHERE id _postagem = ?
# Update postagem
UPDATE `postagens` SET `conteudo`=?, `id_topico`=?, WHERE id = ? ")
# Delete topico
DELETE FROM `topicos` WHERE id = ?
Modelos
usuario.php
postagem.php
topico.php
comentario.php
Controllers
usuarioController.php
postagemController.php
topicoController.php
comentarioController.php
Views
login.html
home.html
ultimaspostagens.html
inserirpostagem.htlm
editarcadastro.html
pesquisarpostagens.html
if(empty($_POST["email"]))
$erro = "Campo e-mail obrigatório";
else
if(empty($_POST["senha"]))
$erro = "Campo senha obrigatório";
eles
if(empty($_POST["curso"]))
$erro = "Campo curso obrigatório";
else
{
//Vamos realizar o cadastro ou alteração dos dados enviados.
}
}
$nome = $_POST["nome"];
$email = $_POST["email"];
$senha = $_POST["senha"];
$curso = $_POST["curso"];
if(!$stmt->execute())
{
$erro = $stmt->error;
}
else
{
$sucesso = "Dados cadastrados com sucesso!";
}
if(isset($erro))
echo '<div style="color:#F00"> '.$erro.' </div><br/><br/>';
else
if(isset($sucesso))
echo '<div style="color:#00f"> '.$sucesso.' </div><br/><br/>';
É possível que após um tempo o número de usuários do sistema cresça a um ponto da base
de dados sobrecarregar e termos erros gerados. Este problema costuma acontecer quando a tabela
está fragmentada demais, é possível no PHPMyAdmin realizar a operação 'otimizar tabela' para
melhorar a situação da base de dados reorganizando as tabelas no disco. Outra solução seria
melhorar as queries SQL deixando-as mais otimizadas e diminuindo o tempo de consulta.
Apesar de tais problemas o MySQL 5.5 possui escalabilidade bastante interessante que
poderia comportar o sistema mesmo que ele cresça.
Em testes usando o MySQL 5.5 release candidate comparado com o MySQL 5.1, resultados
demonstraram claramente as melhorias em performance obtidas:
•No Windows: até 1500% de ganhos em performance para operações de Leitura/Escrita e 500%
em apenas Leitura.
•No Linux: até 360% de ganhos em performance em Leitura/Escrita e outros 200% em apenas
Leitura.
Também é possível escalar o PHP através do uso de técnicas mais avançadas como caches e
clusters.
11. Segurança
Apenas salvar a senha do usuário no banco sem nenhuma criptografia é algo totalmente
inseguro e até antiético. A questão da insegurança é pelo fato de que se um usuário mal
intencionado consegue capturar a lista de usuários através de um SELECT qualquer ou mesmo
consegue acesso ao banco, ele terá em mãos a senha de todos os usuários da sua aplicação.
Além de ele poder acessar seu sistema com qualquer usuário que desejar ele ainda pode
acessar outros serviços destes usuários (email, chat's e etc.), pois geralmente eles usam a mesma
senha para todos os serviços, e isso é fato já que ninguém gosta de guardar 20 senhas, 1 para cada
serviço que utilize.
A questão de ser antiético é porque mesmo um funcionário autorizado a ter acesso ao banco
e ver todos os dados, não pode (ou pelo menos não poderia) ler as senhas dos usuários, isso porque
chegamos naquele mesmo ponto: Um usuário pode (e quase sempre o faz) utilizar a mesma senha
para vários serviços.