Bases de Dados vs. files

AragTey

Power Member
Boas, antes de mais dizem-me dizer que apesar de já programar a uns anitos nunca trabalhei com base de dados, por isso o meu conhecimente das mesmas é praticamente nulo.

No entanto tenho andado agora a pensar na questão das bases de dados e não consigo compreender qual a grande vantagem das mesmas.

Isto é tendo nós um programa com uma grande variedade e quantidade de dados, quais as vantagens de usar uma DB em vez de gravar de forma ordenada e optimizada os dados e files.

Obrigado pelas dicas...
 
Segurança!

Acima de tudo, segurança.

Ou encriptas bem o ficheiro de forma a só tu(o programa) saberes como o ler, ou então Base de Dados.

Outros motivos são a velocidade de acesso aos dados, com SQL consegues percorrer uma base de dados na boa, com um ficheiro já não é assim tão linear..., tens de o carregar primeiro para depois poderes andar a brincar de uma forma mais prática.
 
e uma base dados tem uma flexibilidade muito maior.
quando se trata de fazer cruzamentos de dados, por exemplo, é muito mais simples usar uma base de dados para o efeito.

E com a complexidade, e quantidade de informação, recorrer a uma base de dados, é quase imprescindivel.
 
Para além do acesso (que não só é mais simples, como também mais rápido), como o HecKel referiu, a alteração de dados, a inserção de dados ordenadamente, a relação entre entidades, etc.

Tudo isto é trivial com bases de dados e com ficheiros já não é bem assim.

Imagina o que é uma empresa guardar a informação toda respeitante a um cliente num ficheiro. Agora imagina que essa empresa tem 1000 clientes, já estás a ver o tamanho do ficheiro. Agora imagina que queres remover um cliente ... barrote. Faz-se, mas não é trivial.

Isto só falando em alteração. Agora imagina o que é representares ligações entre diversas entidades, tudo sob a forma de ficheiros e depois teres de alterar essas relações, etc.

E isto para não falar em propriedades como consistência dos dados, atomicidade das operações, concorrência (alteração dos dados de forma concorrente por programas diferentes), etc.

Nem tem comparação ;)
 
Um exemplo da vida real: sistema de gestão comercial.

Se usasses o sistema de ficheiros terias qualquer coisa semelhante a (muito reduzido):
Código:
-- pasta_clientes
----- cliente_1.xml
----- cliente_2.xml
----- cliente_N.xml

-- pasta_facturas
----- factura_1.xml
----- factura_2.xml
----- factura_N.xml

-- pasta_recibos
----- recibo_1.xml
----- recibo_2.xml
----- recibo_N.xml

Ora, só por aqui começas a perceber o problema: como relacionar cada documento com o respectivo cliente.
Provavelmente, irias criar um ficheiro para cada cliente que cruzasse esses dados:
Código:
-- pasta_clientes
----- cliente_1_facturas.xml
----- cliente_1_recibos.xml
----- cliente_2_facturas.xml
----- cliente_2_recibos.xml
----- cliente_N_facturas.xml
----- cliente_N_recibos.xml
Depois, vinha o problema seguinte: como relacionar cada recibo com as respectivas facturas. Talvez optasses por fazer:
Código:
-- pasta_recibos
----- recibo_1_facturas.xml
----- recibo_2_facturas.xml
----- recibo_N_facturas.xml
AH! mas e se precisasses de saber quais os recibos referentes a uma determinada factura? bom, se calhar irias ter necessidade:
Código:
-- pasta_facturas
----- factura_1_recibos.xml
----- factura_2_recibos.xml
----- factura_N_recibos.xml
Já estás a ver a coisa a complicar-se...

Agora lembravas-te que precisavas de calcular a diferença entre o que foi facturado e o que foi recebido num determinado período. Ora, vá de percorrer todos os ficheiros referentes a facturas e, consoante a data, incrementar a variável total_facturado. Repetes a mesma operação com os ficheiros referentes a recibos para saberes o total_recebido. No final subtrais.

Precisavas ainda de mostrar ao cliente a sua conta corrente: vá de percorrer todos os ficheiros de facturas e recibos e fazer as contas necessárias.

Isto é uma mini-mini-amostra do embróglio em que estavas metido se não usasses um SGBD para este trabalho.
 
Boas! Aproveito o tópico para lançar uma questão. As bases de dados trabalham da mesma forma, por ficheiros certo suponho!
Um sistema de gestão de bases de dados carrega uma bd totalmente ou mantém ficheiros 'hash table' look alike para reduzir o consumo de memória e assim?
 
Um exemplo da vida real: sistema de gestão comercial.

Se usasses o sistema de ficheiros terias qualquer coisa semelhante a (muito reduzido):
Código:
-- pasta_clientes
----- cliente_1.xml
----- cliente_2.xml
----- cliente_N.xml
 
-- pasta_facturas
----- factura_1.xml
----- factura_2.xml
----- factura_N.xml
 
-- pasta_recibos
----- recibo_1.xml
----- recibo_2.xml
----- recibo_N.xml

Ora, só por aqui começas a perceber o problema: como relacionar cada documento com o respectivo cliente.
Provavelmente, irias criar um ficheiro para cada cliente que cruzasse esses dados:
Código:
-- pasta_clientes
----- cliente_1_facturas.xml
----- cliente_1_recibos.xml
----- cliente_2_facturas.xml
----- cliente_2_recibos.xml
----- cliente_N_facturas.xml
----- cliente_N_recibos.xml
Depois, vinha o problema seguinte: como relacionar cada recibo com as respectivas facturas. Talvez optasses por fazer:
Código:
-- pasta_recibos
----- recibo_1_facturas.xml
----- recibo_2_facturas.xml
----- recibo_N_facturas.xml
AH! mas e se precisasses de saber quais os recibos referentes a uma determinada factura? bom, se calhar irias ter necessidade:
Código:
-- pasta_facturas
----- factura_1_recibos.xml
----- factura_2_recibos.xml
----- factura_N_recibos.xml
Já estás a ver a coisa a complicar-se...

Agora lembravas-te que precisavas de calcular a diferença entre o que foi facturado e o que foi recebido num determinado período. Ora, vá de percorrer todos os ficheiros referentes a facturas e, consoante a data, incrementar a variável total_facturado. Repetes a mesma operação com os ficheiros referentes a recibos para saberes o total_recebido. No final subtrais.

Precisavas ainda de mostrar ao cliente a sua conta corrente: vá de percorrer todos os ficheiros de facturas e recibos e fazer as contas necessárias.

Isto é uma mini-mini-amostra do embróglio em que estavas metido se não usasses um SGBD para este trabalho.

Alternativamente, usavas XQuery :D.
 
Boas! Aproveito o tópico para lançar uma questão. As bases de dados trabalham da mesma forma, por ficheiros certo suponho!

Pois foi exactamente por pensar nisso que resolvir perguntar aqui ao pessoal.


Vamos la a ver em ultima instância as BD também vao usar ficheiros para armazenar e guardar a informação ou nem por isso?

Por isso, não desprezando o trabalho de empresas como a ORACLE ou algo parecido, mas penso que isso qualquer entidade ou poderia fazer (evitando custos de licencas de BD), ou será uma tarefa abismal que mais vale pagar ao quem já o tem?

Outro assunto que desconheco é o seguinte: supondo que temos um software ligado a uma BD, como funcionam esse processos, isto é existe uma ligação permanente do software com a BD, estando esta á espera de pedidos? Se sim como se reflete isso em termos de memória (ocupa muito ou nem por isso)?
 
Concordo com tudo menos com uma coisa!
Dizem que com bases de dados é mais rapido, de facto é mais rapido a nivel de desenvolvimento no entanto a nivel de processamento/execução abrir um ficheiro é muito mais rapido. Claro que existem DBMS mais rápidos que outros mas abrir um ficheiro e le-lo sequencialmente, fazer append (escrever no final) é mais rapido do que andar a fazer insert's numa bd. No entanto é obvio que a menos que se necessite de muita optimização um DBMS deve ser sempre a escolha.
 
Por isso, não desprezando o trabalho de empresas como a ORACLE ou algo parecido, mas penso que isso qualquer entidade ou poderia fazer (evitando custos de licencas de BD), ou será uma tarefa abismal que mais vale pagar ao quem já o tem?
Nunca ouviste falar em PostgreSQL? ou mesmo MySQL? ou Firebird?

Vamos la a ver em ultima instância as BD também vao usar ficheiros para armazenar e guardar a informação ou nem por isso?
Há mais sítios onde armazenar dados de forma persistente?
 
Última edição:
supondo que temos um software ligado a uma BD, como funcionam esse processos, isto é existe uma ligação permanente do software com a BD, estando esta á espera de pedidos? Se sim como se reflete isso em termos de memória (ocupa muito ou nem por isso)?
It depends. Pode ser de ambas as formas que referes. É evidente que no segundo cenário te ocupará mais memória enquanto que no primeiro te puxa mais pelo processador.
 
Normalmente abres a ligação, fazes o que tens a fazer e fechas a ligação, para garantires que não há trincos que fiquem activos e depois outros acessos concorrentes possam dar barraca desnecessariamente.
 
Agora peço eu desculpa pelo thread jacking mas vou fazer a minha PAT e vou ter que fazer com BD porque o meu prof não me quer ensinar a programar com ficheiros (cá para mim ele não sabe, porque muitas coisas dá por ficheiros que saca online:P).

Eu vou precisar que a minha BD esteja sempre a interagir com o software que criarei (o software será para gerir uma loja de informática, stocks, funcionários, pedidos e reclamações, lucros, despesas, quanto dinheiro entra (não é o mesmo que lucro para quem ler a pressaXD), informações de vendas realizadas por funcionário X, reclamações dirigidas devido à falta de serviço de qualidade desse mesmo funcionário, ou até recomendações, fornecedores, informações dos clientes e respectivos descontos dependendo de determinadas caracteristicas definidas pelo admin do sistema/dono da loja), pois:

- Sempre que um cliente pedir um serviço ou efectuar uma compra/venda, terá que não só ser actualizado o stock, mas também, terá que ser registada na conta do cliente que efectuou X compra/venda ou pedido de serviço. Será também actualizada a ficha do funcionário que atendeu o cliente adicionando nela a nova venda a outras já existentes.
- Em caso de baixa de stock, será enviado um aviso ao admin.
- Em caso de reclamação, esta também é reinviada automaticamente ao admin juntamente com as informações do cliente e do funcionário, etc...

Agora diz-me, como é que farei isto sem dar barraca, pois o sistema terá que fazer tudo automáticamente, o funcionário só poem na lista os pedidos do cliente, e o resto o meu programa faz. se os trincos tem que ser constantemente fechados, não há problema em fazer algo assim? peço desculpa pela ignorância mas nunca nenhum prof meu me conseguiu esclarecer nada do que fosse mais "avançado"(se bem que isto ainda é bastante básico) em programação.

Abraço
 
Agora peço eu desculpa pelo thread jacking mas vou fazer a minha PAT e vou ter que fazer com BD porque o meu prof não me quer ensinar a programar com ficheiros (cá para mim ele não sabe, porque muitas coisas dá por ficheiros que saca online:P).

Eu vou precisar que a minha BD esteja sempre a interagir com o software que criarei (o software será para gerir uma loja de informática, stocks, funcionários, pedidos e reclamações, lucros, despesas, quanto dinheiro entra (não é o mesmo que lucro para quem ler a pressaXD), informações de vendas realizadas por funcionário X, reclamações dirigidas devido à falta de serviço de qualidade desse mesmo funcionário, ou até recomendações, fornecedores, informações dos clientes e respectivos descontos dependendo de determinadas caracteristicas definidas pelo admin do sistema/dono da loja), pois:

- Sempre que um cliente pedir um serviço ou efectuar uma compra/venda, terá que não só ser actualizado o stock, mas também, terá que ser registada na conta do cliente que efectuou X compra/venda ou pedido de serviço. Será também actualizada a ficha do funcionário que atendeu o cliente adicionando nela a nova venda a outras já existentes.
- Em caso de baixa de stock, será enviado um aviso ao admin.
- Em caso de reclamação, esta também é reinviada automaticamente ao admin juntamente com as informações do cliente e do funcionário, etc...

Agora diz-me, como é que farei isto sem dar barraca, pois o sistema terá que fazer tudo automáticamente, o funcionário só poem na lista os pedidos do cliente, e o resto o meu programa faz. se os trincos tem que ser constantemente fechados, não há problema em fazer algo assim? peço desculpa pela ignorância mas nunca nenhum prof meu me conseguiu esclarecer nada do que fosse mais "avançado"(se bem que isto ainda é bastante básico) em programação.

Abraço

A questão dos trincos é só para no caso de teres programas diferentes (ou threads diferentes) a aceder concorrentemente aos mesmos dados.

Tens mecanismos para fazer rolback caso as transacções tenham falhas, por forma a evitar inconsistências nos dados, etc.

Mas isso é algo que só saberás a fundo estudando um pouco da teórica de base de dados.

Se só tens uma aplicação, a não ser que tenhas diversas "threads" do mesmo programa a aceder à bd, não deverás ter problemas. Basta-te fazer uma queue das operações a fazer e depois cada vez que queres aceder à bd, ligas, fazes a query e desligas e passas para a próxima.

Já agora o programa é em quê? Página web php, aplicação stand-alone java, C, C# ?
 
Segurança!

Acima de tudo, segurança.

Ou encriptas bem o ficheiro de forma a só tu(o programa) saberes como o ler, ou então Base de Dados.

Em primeiro lugar base de dados não tem nada a ver com segurança... Qualquer pessoa tb sabe ler uma base de dados... É só fazer um select :D

Agora em relação ao tópico Base de Dados vs Ficheiros tudo depende do que quiseres fazer e do volume de registos que está a pensar ter... Claro que as bases de dados são implementadas em "cima de ficheiros"...mas desenganem-se se acham que podem vocês mesmo implementar uma coisa parecida... Estamos a falar de rollback's, suporte multi-thread, particionamento de tabelas, etc... Isso é coisa pa levar anos e mesmo assim ficar mal feita :D

Diria que se queres apenas fazer o store e o load de informação podes usar ficheiros...agora se pretendes suportar edit's e removes aí vais ter uma tarefa incomparávelmente mais difícil se não optares por BD...
 
Em primeiro lugar base de dados não tem nada a ver com segurança... Qualquer pessoa tb sabe ler uma base de dados... É só fazer um select :D
Então avisa os bancos :P Não vão eles estarem a ser roubados :P

Existe segurança sim, e é um dos motivos mais fortes. Não sei quanto às outros SGBDs, mas com o Oracle até hierarquia de acesso às tabelas podes definir.

E um select sem saberes as tabelas de que te vale? :P
 
Ok, primeiro passo: olha para as features que qualquer sistema de bases de dados oferece, e depois diz-me quanto tempo demorarias a implementar essas features.

Não se trata apenas de "guardar dados". É também como tratá-los. Por exemplo, criação de índices para tornar (muito) mais rápido o acesso aos dados que precisas. Manutenção dos dados, segurança, etc.
Já para não falar que o SQL foi desenvolvido específicamente a pensar nestes problemas. Em apenas uma "frase" consegues obter os dados da forma que queres. A alternativa era teres de andar a programar cada "pergunta" à mão, ou, pior ainda, desenvolveres tu uma "linguagem" para comunicares o que queres com a base de dados. Não sei se estás a ver bem o tempo que perdias só a fazer isto...

Bases de dados são excelentes e recomendam-se. Não vale a pena perder tempo em implementações dessas, que apenas te complicam a vida, não trazem nada de novo, e tornam muito mais complicada a manutenção do programa. No máximo, podes criar um sistema de bases de dados teu, mas... acho que terias que ficar anos a programar até conseguires ter algo semelhante ao que já encontras, grátis, na comunidade :)
 
Então avisa os bancos :P Não vão eles estarem a ser roubados :P

Existe segurança sim, e é um dos motivos mais fortes. Não sei quanto às outros SGBDs, mas com o Oracle até hierarquia de acesso às tabelas podes definir.

E um select sem saberes as tabelas de que te vale? :P

De certeza que os bancos devem ter pensado...ei pá...o nosso sistema não é mt seguro...humm...deixa-me lá por aqui um oracle topo de gama... :lol:


Em Oracle como em quase todos as SGBD's podes definir vistas sobre as tabelas da BD e deixar que apenas determinados utilizadores da BD acedam às tabelas... Agora dizes que a maior razão para usar BD's é a segurança!? Também com ficheiros podes definir essas politicas de acesso por utilizador... Tudo depende de como implementas a tua aplicação... Se o teu código não estiver feito de forma a evitar certos ataques como por exemplo sql injection lá se vai a "tua" segurança... Nesse caso até te valia mais teres isso em ficheiros :D

As vantagens de utilizar BD's são sobretudo ao nível de performance (podes escalar a tua aplicação sem grandes dificuldades), e simplicidade de implementação...
 
Bases de dados são excelentes e recomendam-se. Não vale a pena perder tempo em implementações dessas, que apenas te complicam a vida, não trazem nada de novo, e tornam muito mais complicada a manutenção do programa. No máximo, podes criar um sistema de bases de dados teu, mas... acho que terias que ficar anos a programar até conseguires ter algo semelhante ao que já encontras, grátis, na comunidade :)

Pois eu não duvido disso e não é minha pretensão passar os proximos 10 anos a desenvolver uma :) .

Mas quando é que compensa incluir uma base de dados? Porque na minha opinião hoje em dia usam-se as base de dados para tudo e mais alguma coisa, mas de certeza que em muitas aplicações é mais aconselhado usar files, ou estou enganado? Mesmo para pouca informaçao é mais eficiente usar BD?

Ainda não consegui perceber bem o funcinamento das BD, supondo que faço uma query a BD, o que irá acontecer? Os dados da BD já estão carregados em memória e é feita a query, ou após o pedido é que a informação vai ser carregada e depois de obter o resultado irá ser libertada essa memória?

Neste momento parece-me que, para pequenas aplicações, as bases de dados só são uteis no caso de termos portabilidade dos dados, ou seja termos a mesma informação tanto em C, como um PHP para uma aplicação Web. Ou aqui também estou enganado :D.

Obrigados a todos pelas respostas necessárias á iliminação de mi pobre sabedoria...lol
 
Mas quando é que compensa incluir uma base de dados?
Sempre que precises de armazenar e relacionar dados.
A pergunta devia ser feita ao contrário: quando é que compensa usar ficheiros para armazenar dados. ;-)

Por exemplo, eu costumo usar ficheiros para armazenar dados referentes a configurações de uma aplicação (dados que raramente são alterados, por exemplo: configurações para acesso à BD); e uso a BD para armazenar dados que precisem de ser relacionados entre si.
 
Back
Topo