EleiçãoDB
Pesquisa e Motivação
O nosso brainstorming inicial deixou claro que não havia muitos serviços presentes que armazenassem e apresentassem dados eleitorais ao público em geral e até mesmo aos meios de comunicação. Com este projeto, queríamos preencher essa lacuna, fornecendo informações como transações partidárias e dados demográficos avançados dos eleitores, que não são divulgadas em nenhum meio de comunicação nem armazenadas em bancos de dados atuais.
Bancos de dados atuais como http://www.indiavotes.com, embora forneçam resultados pós-eleitorais, como participação eleitoral e disputas acirradas, não fornecem qualquer informação que possa ajudar a prever as eleições. Além disso, não há informações sobre trabalhadores eleitorais ou EVMs. Acreditamos que estes dados são fundamentais para o bom funcionamento das eleições e fizemos questão de incluí-los no nosso projeto. Esperamos que o nosso projecto ajude a criar eleições bem informadas nos tempos que virão e que ao utilizar o nosso projecto todos possam analisar melhor as suas escolhas.
Visão geral
Criamos um sistema de banco de dados eleitoral indiano que armazena informações sobre as eleições, eleitores, comissão eleitoral, candidatos e partidos políticos. Através do nosso site, o usuário pode ter acesso a todos os dados de que necessita.
Premissa: Temos acesso a todos os dados sobre os partidos e eleições.
Nossos principais stakeholders serão eleitores, partidos políticos, meios de comunicação e pesquisadores independentes.
- Para os eleitores, você poderá ver quanto dinheiro os partidos políticos gastaram em anúncios usando gráficos fáceis de entender. Comparação de diferentes candidatos políticos em educação, história política e antecedentes criminais. Além disso, a repartição das despesas partidárias ajudará a monitorizar a utilização do dinheiro dos impostos e a colocar o uso indevido do dinheiro no centro das atenções públicas.
- Para os Partidos Políticos, você obterá a demografia dos eleitores em todos os distritos em diversas linhas. Além disso, eles podem acessar informações sobre candidatos de outros partidos e traçar estratégias para seus candidatos de acordo.
- Para meios de comunicação e pesquisadores independentes, você pode combinar os dados do eleitor e do partido para analisar por que um partido político conseguiu vencer um determinado distrito. Além disso, ao analisar mais detalhadamente os dados, você poderá obter uma visão melhor das tendências de votação. Os dados sobre as despesas partidárias e o histórico dos candidatos também podem ser úteis para estas agências/indivíduos.
- Para a Comissão Eleitoral, os registos de todos os dirigentes envolvidos no processo eleitoral permitirão uma administração mais fácil e também agilizarão o processo de atribuição de dirigentes a cada distrito. Além disso, as informações do EVM serão úteis para encontrar e substituir máquinas defeituosas
Projeto Técnico
Back-end
Decidimos usar o Django Framework em nosso aplicativo, pois é um framework web baseado em python e segue o padrão arquitetônico model-template-view, o que o torna altamente escalável.
Os principais problemas que encontramos/antecipamos durante nosso projeto na parte backend foram:
- Como controlar as múltiplas solicitações de atualização do banco de dados simultaneamente - Para isso decidimos utilizar bloqueios em nosso servidor. Uma vez que um thread tenha adquirido o bloqueio, todas as tentativas subsequentes de adquirir o bloqueio serão bloqueadas até que ele seja liberado. E era necessário que as threads adquirissem o bloqueio antes de executar a consulta ao banco de dados. Assim, os bloqueios garantiram que apenas um cliente pudesse atualizar o banco de dados por vez.
- Múltiplas consultas ao mesmo tempo - Para superar este problema decidimos processar a solicitação de cada cliente em um novo thread, o que nos ajudou a entregar a resposta mais rapidamente, pois a solicitação do cliente não exigia esperar a conclusão de outra solicitação. Notamos uma diminuição significativa no tempo de uso dos threads para cada solicitação.
- Situação de perda de conexão com o banco de dados - Antecipamos que é bem possível que a conexão com o banco de dados se perca e para isso criamos uma tabela de log em nosso servidor que guarda a entrada de cada transação que o servidor está fazendo com o banco de dados.
- Criando uma memória cache no servidor - À medida que o banco de dados continua recebendo atualizações, precisamos fornecer aos clientes valores atualizados sempre que o valor for atualizado. Então para isso decidimos fazer uma memória cache que será atualizada sempre que alguém atualizar o banco de dados. Também ajuda a economizar o custo de envio de uma consulta ao banco de dados para cada usuário, pois esse cache atualizado é entregue e apenas uma solicitação é suficiente para todos os usuários.
Front-end
Utilizamos VanillaJS com HTML e CSS para fazer o frontend.
Os principais problemas que encontramos/antecipamos durante nosso projeto na parte backend foram:
- Atualizando dinamicamente os gráficos e tabelas na página web - Prevemos que o banco de dados poderá ser atualizado por outro usuário enquanto alguém estiver navegando em nosso site e não será possível para os usuários continuarem atualizando as páginas web para obter atualizações. Então, para superar esse problema, decidimos usar a função AJAX para atualizar dinamicamente os gráficos e tabelas para os usuários, evitando a necessidade de atualizar a página da web. Além disso, é altamente eficiente, pois retira os dados da memória cache do servidor e não requer o envio da consulta ao banco de dados.
Banco de dados
Criamos uma Tabela para cada interessado armazenar seus dados e algumas tabelas para estabelecer relações entre eles. Para tabelas que possuem grandes dados como eleitores, criamos sua tabela de índice para que possamos acessar seus dados rapidamente. Também normalizamos o banco de dados para que seja fácil de entender e mais eficiente de atualizar.
O banco de dados é publicado nos servidores Microsoft Azure e pode ser acessado usando o software de gerenciamento Microsoft SQL Server.
Documentação
O usuário deve fazer o seguinte para executar este projeto:
- Como este projeto é implementado no Django Framework, o usuário deve instalar o Django em sua máquina e depois ir para o diretório do projeto DBMS_PROJECT/django_project
- Após abrir este diretório, o usuário deve executar o seguinte comando:
python manage . py runserver
- Depois disso, o usuário poderá ver as seguintes linhas:
You have 17 unapplied migration ( s ). Your project may not work properly until you apply the migrations for app ( s ): admin , auth , content types , sessions .
Run 'python manage.py migrate' to apply them .
April 30 , 2020 - 14 : 41 : 47
Django version 3.0 . 5 , using settings 'django_project.settings'
Starting development server at http : // 127.0 . 0.1 : 8000 /
Quit the server with CTRL - BREAK .
- Abra o link localhost. O projeto seria então aberto no navegador.
Implementação de bônus
Criamos uma eleição virtual que nos permite estimar o resultado da eleição antes do resultado real. Um usuário faz login em nosso site e escolhe o candidato, uma vez feito isso ele não poderá votar novamente. Desta forma criamos uma tabela com os dados do eleitor e seu voto e após algum tempo específico, declaramos os resultados estimados aos nossos usuários.
Dessa forma, fornecemos ao nosso usuário o resultado antes que os votos reais comecem a ser contados.
Criamos um serviço altamente eficiente que rastreia transações, mantém memória cache, mantém bloqueios de simultaneidade e entrega resultados rápidos usando multithreading. Os detalhes são mencionados no projeto técnico.
Criamos páginas da web altamente eficientes que permitem ao usuário continuar obtendo dados atualizados sem sequer atualizar a página da web. Os detalhes são mencionados no projeto técnico.
Diagrama ER
Link: https://app.creately.com/diagram/knHC7u2yS86/
Co-Contribuidores
- Bhavay Aggarwal 2018384
- Diptanshu Mittal 2018232
- Manas 2018244
- Rishabh Chauhan 2018256