Boas razões para NÃO usar um banco de dados relacional?


139

Você pode apontar para ferramentas alternativas de armazenamento de dados e fornecer bons motivos para usá-las em vez de bons e antigos bancos de dados relacionais? Na minha opinião, a maioria dos aplicativos raramente usa todo o poder do SQL - seria interessante ver como criar um aplicativo sem SQL.

Respostas:


148

Arquivos de texto sem formatação em um sistema de arquivos

  • Muito simples de criar e editar
  • Fácil para os usuários manipularem com ferramentas simples (por exemplo, editores de texto, grep etc.)
  • Armazenamento eficiente de documentos binários

Arquivos XML ou JSON no disco

  • Como acima, mas com um pouco mais de capacidade de validar a estrutura.

Arquivo de planilha / CSV

  • Modelo muito fácil para os usuários de negócios entenderem

Subversion (ou sistema de controle de versão baseado em disco semelhante)

  • Muito bom suporte para controle de versão de dados

Berkeley DB (Basicamente, uma hashtable baseada em disco)

  • Conceitualmente muito simples (apenas chave / valor não digitado)
  • Bem rápido
  • Nenhuma sobrecarga de administração
  • Suporta transações que acredito

DB Simples da Amazon

  • Bem como Berkeley DB, acredito, mas hospedado

Armazenamento de dados do Google App Engine

  • Hospedado e altamente escalável
  • Armazenamento de valor-chave por documento (isto é, modelo de dados flexível)

CouchDB

  • Foco no documento
  • Armazenamento simples de dados semiestruturados / baseados em documentos

Coleções de idiomas nativos (armazenadas na memória ou serializadas em disco)

  • Integração de idioma muito rígida

Mecanismo de armazenamento personalizado (escrito à mão)

  • Desempenho potencialmente muito alto nos casos de uso necessários

Não posso afirmar que sei muita coisa sobre eles, mas você também pode gostar de examinar os sistemas de banco de dados de objetos .


10
Seria ótimo se você também explicasse as desvantagens de cada escolha, caso contrário, como alguém deve escolher? Obrigado,
Sklivvz 28/09/08

4
A gravação de milhões de linhas em um banco de dados também pode levar um dia, enquanto o acréscimo de um milhão de linhas de log a um arquivo leva apenas alguns minutos. Eu nunca vou entender por que as pessoas insistem em colocar dados de log em um banco de dados.
Aaron Digulla

33
Aaron: Eu tenho um motivo: SELECT messages FROM log WHERE (date ENTRE 2009-01-01 AND 2009-03-01) AND type = 'error' AND system = 'windows' :) Como você carregaria isso de um arquivo de texto ?
Tomáš Fejfar 18/08/09

1
Sou totalmente a favor dos arquivos de texto sempre que possível. Você não pode sempre usá-los, mas quando eles podem são muito mais fáceis de diagnosticar problemas no.
Loren Pechtel

O berkeley db definitivamente possui transações. arquivos de texto e arquivos xml / json não, portanto, aplicativos multithread podem esmagá-los se você não tomar cuidado. Os arquivos CSV são maravilhosos para coleções de parâmetros, porque os usuários corporativos podem simplesmente olhá-los e editá-los sem ferramentas extras. Os arquivos de texto são ótimos para aplicativos de gravação única / leitura quase nunca, como o log. Para escolher uma abordagem que você precisa descobrir o que você está tentando realizar
O. Jones

26

A resposta de Matt Sheppard é ótima (mod up), mas eu levaria em conta esses fatores ao pensar em um eixo-árvore:

  1. Estrutura: obviamente se quebra em pedaços ou você está fazendo trocas?
  2. Uso: como os dados serão analisados ​​/ recuperados / grokked?
  3. Tempo de vida: quanto tempo os dados são úteis?
  4. Tamanho: quantos dados existem?

Uma vantagem particular dos arquivos CSV sobre os RDBMSes é que eles podem ser fáceis de condensar e mover-se para praticamente qualquer outra máquina. Fazemos grandes transferências de dados, e tudo é simples o suficiente, apenas usamos um arquivo CSV grande e fácil de script usando ferramentas como rsync. Para reduzir a repetição em grandes arquivos CSV, você pode usar algo como YAML . Não tenho certeza se armazenaria algo como JSON ou XML, a menos que você tenha requisitos significativos de relacionamento.

Quanto às alternativas não mencionadas, não desconsidere o Hadoop , que é uma implementação de código aberto do MapReduce. Isso deve funcionar bem se você tiver uma tonelada de dados fracamente estruturados que precisam ser analisados ​​e desejar estar em um cenário em que pode adicionar apenas mais 10 máquinas para lidar com o processamento de dados.

Por exemplo, comecei a tentar analisar o desempenho que era essencialmente todo o número de temporizações de diferentes funções registradas em torno de 20 máquinas. Depois de tentar colar tudo em um RDBMS, percebi que realmente não preciso consultar os dados novamente depois de agregá-los. E, só é útil em seu formato agregado para mim. Portanto, mantenho os arquivos de log por aí, compactados e deixo os dados agregados em um banco de dados.

Note que estou mais acostumado a pensar em tamanhos "grandes".


5
Um perigo de escape de arquivos CSV precisa ser corrigido; é 'fácil implementar um leitor ou gravador de CSV que realmente não segue as especificações, pois parece tão enganosamente simples e existem algumas sutilezas: en.wikipedia.org/wiki/Comma-separated_values#Specification
Jared Updike

10

O sistema de arquivos é útil para armazenar dados binários, que nunca funcionam surpreendentemente bem em bancos de dados relacionais.



6

Se você não precisar de ACID , provavelmente não precisará da sobrecarga de um RDBMS. Portanto, determine se você precisa disso primeiro. A maioria das respostas não RDBMS fornecidas aqui não fornece ACID.


1
Você pode dar um exemplo do porquê / quando o ACID não é necessário?
Ivan Voroshilin

1
@vibneiro, se o banco de dados tiver apenas um único usuário que faça apenas operações seqüenciais ou se o risco de inconsistências no banco de dados em caso de falta de energia for aceitável, ou se o conceito de transações do banco de dados não se aplicar ou se não houver restrições, cascatas, gatilhos ou similares, um provedor não- ACID e não-RDBMS (por exemplo, um arquivo de texto com uma API semelhante ao RDBMS) pode ser suficiente. Por exemplo, seu aplicativo pode manter um banco de dados de mensagens de diagnóstico históricas para as quais o ACID é completamente irrelevante e "log.txt" será suficiente.
bzlm

Acontece que o ACID não é necessário em casos muito raros. Eu me pergunto por que os bancos de dados NoSQL são tão populares? A maioria deles não suporta ACIDity completo.
Ivan Voroshilin

@vibneiro, o NoSQL é geralmente mais fácil, mais leve, mais incorporável, mais auto-hostável, mais intuitivo, mais flexível e geralmente com algum ACID. Se você não possui dados relacionais, um RDBMS provavelmente não é o que você precisa.
bzlm

6

Mecanismo de armazenamento personalizado (escrito à mão) / Desempenho potencialmente muito alto nos casos de uso necessários

http://www.hdfgroup.org/

Se você tiver enormes conjuntos de dados, em vez de criar seus próprios, poderá usar o HDF, o Hierarchical Data Format.

http://en.wikipedia.org/wiki/Hierarchical_Data_Format :

O HDF suporta vários modelos de dados diferentes, incluindo matrizes multidimensionais, imagens raster e tabelas.

Também é hierárquico como um sistema de arquivos, mas os dados são armazenados em um arquivo binário mágico.

O HDF5 é um conjunto que possibilita o gerenciamento de coleções de dados extremamente grandes e complexas.

Pense em petabytes de dados de sensoriamento remoto da NASA / JPL.


4

G'day,

Um caso em que consigo pensar é quando os dados que você está modelando não podem ser facilmente representados em um banco de dados relacional.

Uma vez que esse exemplo é o banco de dados usado pelas operadoras de telefonia móvel para monitorar e controlar estações base para redes de telefonia móvel.

Em quase todos esses casos, é utilizado um banco de dados OO , seja um produto comercial ou um sistema de rolagem automática que permite hierarquias de objetos.

Trabalhei em um aplicativo de monitoramento 3G para uma grande empresa que permanecerá sem nome, mas cujo logotipo é uma mancha de vinho tinto (-:, e eles usaram esse OO DB para acompanhar todos os vários atributos de células individuais dentro do rede.

A interrogação desses DBs é feita usando técnicas proprietárias que são, geralmente, completamente livres de SQL.

HTH.

Felicidades,

Roubar


4
Por que os dados da estação de base não se prestam bem ao modelo relacional?
Kaybenleroll 28/09/08

3

Os bancos de dados de objetos não são relacionais. Eles podem ser realmente úteis se você quiser colocar alguns objetos em um banco de dados. Eles também suportam controle de versão e modificam classes para objetos que já existem no banco de dados. O db4o é o primeiro que vem à mente.


3

Em alguns casos (dados do mercado financeiro e controle de processos, por exemplo), pode ser necessário usar um banco de dados em tempo real em vez de um RDBMS. Veja o link wiki


3

Havia uma ferramenta RAD chamada JADE escrita há alguns anos atrás que possui um OODBMS embutido. As primeiras encarnações do mecanismo DB também suportaram o Digitalk Smalltalk. Se você deseja provar a criação de aplicativos usando um paradigma não RDBMS, isso pode ser um começo.

Outros produtos OODBMS incluem Objetividade , GemStone (você precisará que o VisualWorks Smalltalk execute a versão Smalltalk, mas também há uma versão java). Havia também alguns projetos de pesquisa de código aberto nesse espaço - EXODUS e seu descendente SHORE vêm à mente.

Infelizmente, o conceito pareceu morrer, provavelmente devido à falta de um padrão claramente visível e à capacidade de consulta ad-hoc relativamente baixa em relação aos sistemas RDMBS baseados em SQL.

Um OODBMS é mais adequado para aplicativos com estruturas de dados principais que são melhor representadas como um gráfico de nós interconectados. Eu costumava dizer que o aplicativo OODBMS por excelência era um MUD (Multi-User Dungeon), onde as salas continham avatares dos jogadores e outros objetos.


2
Costumava ser verdade que você precisava de um cliente Smalltalk para usar o GemStone / S (para aplicativos de desktop), mas com os frameworks da web Aida ( aidaweb.si ) e Seaside ( seaside.st ) GemStone / S pode ser usado diretamente como aplicativo servidor. Veja as informações em GLASS ( seaside.gemstone.com )
Dale Henrichs 07/02/09

Outro motivo seria se você se preocupa com a qualidade dos dados. Em um OODB como o Gemstone, é muito mais fácil impor regras de validade complexas.
21811 Stephan Stephangermont

Ad hoc recursos de consulta de OODBMS é muito melhor do que a de SQL com base RDBMS-es
Stephan Eggermont

1

Você pode percorrer um longo caminho usando apenas os arquivos armazenados no sistema de arquivos. Os RDBMSs estão melhorando no tratamento de blobs, mas essa pode ser uma maneira natural de lidar com dados de imagem e similares, principalmente se as consultas forem simples (enumerar e selecionar itens individuais).

Outras coisas que não se encaixam muito bem em um RDBMS são estruturas hierárquicas de dados e acho que dados geoespaciais e modelos 3D também não são fáceis de trabalhar.

Serviços como o Amazon S3 fornecem modelos de armazenamento mais simples (chave-> valor) que não suportam SQL. Escalabilidade é a chave lá.

Os arquivos do Excel também podem ser úteis, principalmente se os usuários precisarem manipular os dados em um ambiente familiar e criar um aplicativo completo para fazer isso não é viável.


1

Existem várias maneiras de armazenar dados - até mesmo o "banco de dados relacional" abrange uma variedade de alternativas de uma simples biblioteca de código que manipula um arquivo (ou arquivos) local como se fosse um banco de dados relacional com base em um único usuário, por meio de sistemas baseados em arquivos que podem lidar com vários usuários a uma seleção generosa de sistemas baseados em "servidores" sérios.

Usamos muito arquivos XML - você obtém dados bem estruturados, boas ferramentas para consultar a mesma capacidade de fazer edições, se apropriado, algo legível por humanos e você não precisa se preocupar com o funcionamento do mecanismo db (ou com o funcionamento do motor db). Isso funciona bem para coisas que são essencialmente somente leitura (no nosso caso, mais frequentemente do que não são geradas a partir de um banco de dados em outro lugar) e também para sistemas de usuário único onde você pode simplesmente carregar os dados e salvá-los conforme necessário - mas você está criando oportunidades para problemas, se você quiser editar vários usuários - pelo menos um arquivo.

Para nós, é isso: vamos usar algo que fará o SQL (a MS oferece um conjunto de ferramentas que são executadas em um .DLL para fazer coisas de usuário único até o servidor corporativo e todos falam o mesmo SQL (com limitações na extremidade inferior)) ou usaremos XML como um formato porque (para nós) a verbosidade raramente é um problema.

No momento, não precisamos manipular dados binários em nossos aplicativos para que essa pergunta não surja.

Murph


1

Pode-se considerar o uso de um servidor LDAP no lugar de um banco de dados SQL tradicional se os dados do aplicativo forem fortemente orientados para chave / valor e de natureza hierárquica.


1

Os arquivos BTree geralmente são muito mais rápidos que os bancos de dados relacionais. O SQLite contém dentro de si uma biblioteca BTree que é de domínio público (como genuinamente 'domínio público', sem usar o termo livremente).

Francamente, se eu quisesse um sistema multiusuário, precisaria de muita persuasão para não usar um banco de dados relacional decente do servidor.


BTrees são a implementação básica de índices normais. O Oracle suporta tabelas organizadas por índice que são apenas uma tabela implementada como índice. São mais rápidos de ler, mais lentos para escrever e usar uma árvore B. Veja: < oracle.com/technology/products/oracle9i/datasheets/iots/… >
borjab

1

Bancos de dados de texto completo, que podem ser consultados com operadores de proximidade, como "dentro de 10 palavras de" etc.

Os bancos de dados relacionais são uma ferramenta comercial ideal para muitos propósitos - fácil de entender e projetar, rápido o suficiente, adequado mesmo quando não são projetados e otimizados por um gênio que poderia "usar toda a energia" etc.

Mas algumas finalidades de negócios exigem indexação de texto completo, que os mecanismos relacionais não fornecem ou aderem posteriormente. Em particular, os campos jurídico e médico têm grandes quantidades de texto não estruturado para armazenar e percorrer.


1

Além disso: * Cenários incorporados - Onde geralmente é necessário usar algo menor que um RDBMS completo. O Db4o é um ODB que pode ser facilmente usado nesse caso. Desenvolvimento rápido ou de prova de conceito - onde você deseja se concentrar nos negócios e não se preocupar com a camada de persistência


1

O teorema do CAP explica sucintamente. O SQL fornece principalmente "Consistência forte: todos os clientes veem a mesma exibição, mesmo na presença de atualizações".


1

BEIJO: Mantenha-o pequeno e simples


1
Essa é a versão educada ... Ouvi com mais frequência "Seja simples, estúpido" ... ou, gole, talvez seja isso que as pessoas me digam! :-(
GreenMatt

1

Eu ofereceria RDBMS :) Se você não costuma ter problemas com a configuração / administração, vá para o SQLite. RDBMS integrado com suporte completo a SQL. Ele ainda permite que você armazene qualquer tipo de dados em qualquer coluna.

Principal vantagem em relação a, por exemplo, arquivo de log: se você possui um enorme, como vai pesquisá-lo? Com o mecanismo SQL, você apenas cria um índice e acelera a operação dramaticamente.

Sobre a pesquisa de texto completo: o SQLite também possui módulos para pesquisa de texto completo.

Apenas aproveite a interface padrão agradável para seus dados :)



0

Eu recomendaria fortemente o Lua como uma alternativa ao armazenamento de dados do tipo SQLite.

Porque:

  • O idioma foi projetado como um idioma de descrição de dados para começar
  • A sintaxe é legível por humanos (XML não é )
  • Pode-se compilar pedaços de Lua para binários, para desempenho adicional

Esta é a opção "coleção de idioma nativo" da resposta aceita. Se você estiver usando C / C ++ como o nível do aplicativo, é perfeitamente razoável ativar o mecanismo Lua (100kB de binário) apenas para ler as configurações / dados ou gravá-las.


Lua é uma linguagem de programação. Essa sugestão pode ser generalizada para sugerir qualquer recurso de persistência / serialização de qualquer linguagem de programação (por exemplo, pickle / shelve em Python ou JSON / YAML para Perl et al, e assim por diante). Isso não trata do acesso simultâneo e das garantias ACID.
Jim Dennis

Você está certo. O que estava faltando na minha entrada era a natureza implícita somente leitura desse uso. Nesse cenário, mantenho meu texto. Para leitura-gravação, o uso de Lua dessa maneira não faz absolutamente nenhum sentido. Muitas coisas, em geral, os metadados do sistema de arquivos são somente leitura, para que essa abordagem não signifique requisitos completos de ro.
akauppi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.