Sou estudante de graduação e ainda não trabalhei com nenhum banco de dados, então peço desculpas se não entendi/utilizei mal algum termo. Minha pergunta vem de uma tarefa minha, mas esta é minha tentativa de aprender e não fazer o dever de casa para mim.
A tarefa, parafraseada:
O serviço de impressão de uma universidade permite que os alunos do campus carreguem seus arquivos no sistema e enviem os arquivos carregados para uma das impressoras da universidade para impressão... O sistema registra todas as impressões feitas por todos os alunos, registrando a identificação do aluno, qual impressora foi usada , o nome do arquivo de impressão, bem como a hora da impressão. Um administrador do sistema deve ser capaz de visualizar o arquivo de log filtrado para qualquer aluno, impressora e/ou período de tempo (que eu saiba, isso requer indexação).
Uma questão que me deparo é qual abordagem de armazenamento de dados (banco de dados ou sistema de arquivos) devo usar para os arquivos do aluno e o arquivo de log, sendo ambos dados de crescimento frequente.
A partir desta pergunta do SO, concluí que os arquivos de atualização freqüentes são melhor armazenados como armazenamento do sistema de arquivos e, a partir desta pergunta, os arquivos podem ser armazenados em um banco de dados com blobs.
Minhas perguntas são:
- O arquivo de log deve ser armazenado no banco de dados ou no sistema de arquivos? (Ou acho que a questão determinante seria "É possível filtrar por vários valores sem indexação?")
- Se os arquivos dos alunos forem armazenados com um blob relacionado a um aluno na tabela do banco de dados, é possível que cada aluno tenha acesso apenas aos seus próprios arquivos?
- Por que o sistema de arquivos é mais adequado para arquivos que crescem com frequência?
- É possível (ou prático) que um servidor use banco de dados e sistema de arquivos?
Com base no seguinte, qual é a principal preocupação
você deve armazenar os dados em um banco de dados. Certamente os logs usando arquivos são mais eficientes, porém os logs armazenados no banco de dados são mais fáceis de ler e manter e parece que você precisa ler muito.
Duas tabelas são suficientes se você não tiver descrições para impressoras ou manter informações sobre os alunos (na sua pergunta é mencionado que apenas estudanteid, impressora, data e descrição da impressão são necessários).
O exemplo a seguir é baseado em MySQL (a sintaxe pode diferir em diferentes SGBDs)
printed
mesaprinted_details
mesaCom índices adequados, a velocidade não será um problema.
O aspecto de "filtragem" da visualização dos logs indica fortemente uma solução de banco de dados .
Toda a complexidade de "entender" o formato do registro armazenado e extrair os bits de seu interesse é cuidada pelo seu banco de dados. Coloque-o em um arquivo e você terá que reinventar todo esse trabalho.
Além disso, deixar os dados no banco de dados proporciona controles de segurança muito melhores sobre eles. Uma vez "disponível" em um arquivo, é muito mais difícil manter as coisas seguras.
Sim. "Segurança em nível de linha" é um termo comumente usado para isso.
No entanto, IMHO, seus alunos não deveriam ter acesso ao banco de dados . O aplicativo que eles usam para ver as coisas deve usar uma conta de serviço separada (ou seja, secreta). Os usuários finais não devem ter suas próprias contas [banco de dados] dentro do banco de dados.
Simplificando, é para isso que os sistemas de arquivos são criados.
Escrever novos registros em uma tabela é a finalidade dos SGBDs, mas estender os valores dentro das linhas existentes? Não muito.
Sim, mas desnecessário.
Independentemente de como você armazena esses dados, lembre-se de que eles só crescerão, a menos que você estabeleça alguma manutenção doméstica para eles.
Alguém realmente se importará com aquela pessoa ‘X’ que imprimiu o documento ‘Y’ há sete anos e meio? É improvável, então você precisa ter processos em vigor para destruir os dados que você realmente não precisa mais (ou que, [legalmente], não são mais obrigados/permitidos manter - consulte "GDPR" se for algum tipo de " surpresa" para você).