Você está na página 1de 10

Relatório Final de Banco de Dados

Fórum universitário

Universidade Estadual do Ceará – Centro de Ciências e Tecnologia


Semestre 2019.1
Grupo: Matheus Santos Araújo, Ivo AguiarPimenta, Francisco Bruno e Nicolas Josino.

1. Apresentação do Problema

O problema apresentado neste documento consiste na criação de uma aplicação de fórum


voltada para o ambiente de universidades no seu projeto de banco de banco de dados e arquitetura
de software. Esse projeto foi conduzido em refinamentos sucessivos, começando pelo planejamento
da arquitetura do sistema, passando ao detalhamento dos componentes da arquitetura, até chegar ao
projeto detalhado dos códigos. Este documento está organizado da seguinte forma: a seção 2
apresenta problemas semlehantes ao deste projeto; a seção 3 mostra as especificações de caso de
uso do sistema; A seção 4 informa os objetos definidos no contexto do sistema bem como seus
atributos e métodos; A seção 5 apresenta as tabelas de forma gráfica baseada nos objetos do
problema, bem como a definição dos tipos e chaves; seção 6 apresenta os relacionamentos entre as
tabelas e suas chaves; a seção 7 discorre sobre todas as consultas possíveis que o usuário pode
realizar no sistema tal como pesquisas por tópico ou curso; a seção 8 apresenta a arquitetura e
estrutura de codificação destacando os componentes e o padrão MVC utilizados neste projeto; a
seção 9 inclui detalhes da implementação eem PHP tanto quanto sua conexão com o banco de dados
relacional MySQL e hospedagem na nuvem; a seção 10 apresenta situações críticas onde a base de
dados pode ser sobrecarregada e os limites do sistema; a seção 11 apresenta conceitos de segurança
e proteção de dados utilizados na base de dados do sistema.

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.

3. Especificação dos Casos de Uso do Sistema


Manter Cadastro: Criar, editar, ver e excluir cadastro.

Manter Pergunta: Criar, editar, ver e excluir cadastro.

Logar: Acessar o sistema a partir de sua senha e e-mail.

Comentar Pergunta: Inserir comentário em determinada postagem de determinado usuário.

Manter Comentário: Criar, editar, ver e excluir comentário.

Pesquisar Perguntas por Curso: Pesquisar perguntas de um mesmo curso.

Pesquisar Perguntas por Tópico: Pesquisar perguntas de um determinado tópico.

Pesquisar Perguntas por Usuário: Pesquisar perguntas de um determinado usuário.

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.

A implementação em linguagem SQL da criação da tabela vem a seguir:

CREATE TABLE usuarios(


id INTEGER NOT NULL AUTO_INCREMENT,
email VARCHAR(50) NOT NULL,
senha VARCHAR(50) NOT NULL,
nome VARCHAR(50) NOT NULL,
curso VARCHAR(50) NOT NULL,
PRIMARY KEY(id)
);

CREATE TABLE topico(


id INTEGER NOT NULL AUTO_INCREMENT,
id_usuario INTEGER NOT NULL,
titulo VARCHAR(50) NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY (id_usuario) REFERENCES usuarios(id)
);
CREATE TABLE postagens(
id INTEGER NOT NULL AUTO_INCREMENT,
id_topico INTEGER NOT NULL,
id_usuario INTEGER NOT NULL,
conteudo VARCHAR(150) NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY (id_topico) REFERENCES topicos(id),
FOREIGN KEY (id_usuario) REFERENCES usuarios(id)
);

CREATE TABLE comentarios(


id int NOT NULL AUTO_INCREMENT,
id_postagem int NOT NULL,
id_ usuario int NOT NULL,
conteudo VARCHAR(100) NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY (id_postagem) REFERENCES postagens(id),
FOREIGN KEY (id_usuario) REFERENCES usuarios(id)
);

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.

7. Lista de consultas que serão efetuadas

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 = ?

A consultas principais são as de busca por por postagens:

SELECT * FROM postagens WHERE id_usuario='$id_usuario

SELECT * FROM postagens WHERE joined='$username

SELECT * FROM postagens WHERE joined='$username


8. Arquitetura de Software

O MVC é um padrão de arquitetura de software, separando sua aplicação em 3 camadas. A


camada de interação do usuário(view), a camada de manipulação dos dados(model) e a camada de
controle(controller). Utilizamos esta arquitetura na nossa aplicação por ser extremamamente
organizada e eficiente para projetos como nosso sistema.

A arquitetura do sistema é mostrada a seguir:

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

9. MySQL, PHP e Hospedagem

A linguagem utilizada foi o PHP ou Hypertext Preprocessor, originalmente Personal Home


Page é uma linguagem interpretada livre, usada originalmente apenas para o desenvolvimento de
aplicações presentes e atuantes no lado do servidor, capazes de gerar conteúdo dinâmico na World
Wide Web. Figura entre as primeiras linguagens passíveis de inserção em documentos HTML,
dispensando em muitos casos o uso de arquivos externos para eventuais processamentos de dados.
O código é interpretado no lado do servidor pelo módulo PHP, que também gera a página web a ser
visualizada no lado do cliente.
Foi utilizado também o MySQL que é é um sistema de gerenciamento de banco de dados
(SGBD), que utiliza a linguagem SQL (Linguagem de Consulta Estruturada, do inglês Structured
Query Language) como interface. É atualmente um dos sistemas de gerenciamento de bancos de
dados mais populares da Oracle Corporation, com mais de 10 milhões de instalações pelo mundo.
Entre os usuários do banco de dados MySQL estão: NASA, Friendster, Banco Bradesco, Dataprev,
HP, Nokia, Google, entre outros.
Como hospedagem escolhemos a Hostinger que é a líder mundial em oferecer hospedagem
de sites para milhões de pessoas que realmente gostam de poupar muito, sem perder as vantagens de
um host com qualidade. A Hostinger também possui suporte para PHP e MySQL e modalidade de
hospedagem gratuita.
1) Definição de vaviáveis úteis a conexão com o banco
$servername = "mysql.hostinger.com";
$database = "forumuniversitario";
$username = "matheusaraujo";
$password = "pa$$word123";

2) Conexão com banco de dados MySQL no PHP

$conn = mysqli_connect($servername, $username, $password, $database);

3) Checagem se a conexão está ativa


if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";

4) Fechar conexão com o MySQL


mysqli_close($conn);

5) Validação da existências dos dados de formulário


if(isset($_POST["nome"]) && isset($_POST["email"]) && isset($_POST["senha"]) &&
isset($_POST["curso"]))
{
if(empty($_POST["nome"]))
$erro = "Campo nome obrigatório";
else

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.
}
}

6) Realizando consulta no MySQL através de PHP

$nome = $_POST["nome"];
$email = $_POST["email"];
$senha = $_POST["senha"];
$curso = $_POST["curso"];

$stmt = $obj_mysqli->prepare("INSERT INTO `usuarios`


(`nome`,`email`,`senha`,`curso`) VALUES (?,?,?,?)");
$stmt→bind_param('ssss', $nome, $email, $senha, $curso);

if(!$stmt->execute())
{
$erro = $stmt->error;
}
else
{
$sucesso = "Dados cadastrados com sucesso!";
}

6) Imprimindo feedback na tela HMTL

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/>';

7) Retornando usuarios em tabela HTML

$result = $obj_mysqli->query("SELECT * FROM `usuarios`");

while ($aux_query = $result->fetch_assoc())


{
echo '<tr>';
echo ' <td>'.$aux_query["Id"].'</td>';
echo ' <td>'.$aux_query["nome"].'</td>';
echo ' <td>'.$aux_query["email"].'</td>';
echo ' <td>'.$aux_query["curso"].'</td>';
echo ' <td><a href="'.$_SERVER["PHP_SELF"].'?id='.$aux_query["Id"].'">Editar</a></td>';
echo '</tr>';
}

10. Sobrecarga da base de dados

É 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.

A solução básica para a situação acima descrita é aplicar algoritmos de criptografia, em


específico os hash. Trabalharemos aqui com o MD5 que é um algoritmo hash de 128 bits
unidirecional, ou seja, quando você codifica uma String com o MD5, não tem mais volta, você não
poderá decodifica-lá para descobrir o valor real da String.
Por ser unidirecional é que o MD5 traz o "poder da segurança" em suas mãos, quer dizer que
nem você (talvez um DBA com acesso total ao Banco de dados) nem qualquer outra pessoa poderão
descobrir o valor original daquela String codificada em MD5.
Existem muitos sites na internet que fazem a Criptografia de Strings em MD5, porém
nenhum faz o inverso. Você encontrará alguns sites que dizem supostamente fazer isso, e você verá
que até acertam para algumas senhas comuns como: 123, admin, root e etc. Na verdade eles não
estão decodificando o MD5 (pois até hoje isso ainda não é possível), eles possuem uma base de
dados com diversas palavras que já foram codificadas e é feita apenas uma consulta a esta base de
dados, nada muito complexo.
Exemplo de uso do PHP com segurança a partir de MD5:
public function BuscarPorEmailSenha ($email, $senha) {
try {
$sql = "SELECT * FROM usuario WHERE email = :email and senha = :senha";
$p_sql = Conexao::getInstance()->prepare($sql);
$p_sql->bindValue(":email", $email);
$p_sql->bindValue(":senha", md5($senha));
$p_sql->execute();
return $this->populaUsuario($p_sql->fetch(PDO::FETCH_ASSOC));
} catch (Exception $e) {
print "Ocorreu um erro ao tentar executar esta ação, foi gerado um LOG do mesmo, tente
novamente mais tarde.";
GeraLog::getInstance()->inserirLog("Erro: Código: " . $e->getCode() . " Mensagem: " .
$e->getMessage());
}
}

Você também pode gostar