Pergunta

Além do google cenário / bigtable, quando você não deveria usar um banco de dados relacional? Por que não, e o que você deve usar? (Você aprendeu 'da maneira mais difícil?)

Foi útil?

Solução

Na minha experiência, você não deve usar um banco de dados relacional quando qualquer um destes critérios forem verdadeiras:

  • seus dados é estruturado como uma hierarquia ou um gráfico (rede) de profundidade arbitrária,
  • o padrão de acesso típico enfatiza lendo sobre a escrita, ou
  • não há nenhuma exigência para consultas ad-hoc.

hierarquias profundas e gráficos não se traduzem bem para tabelas relacionais. Mesmo com a ajuda de extensões proprietárias como CONNECT BY da Oracle, perseguindo as árvores é uma dor poderosa usando SQL.

Bancos de dados relacionais adicionar muita sobrecarga para acesso de leitura simples. integridade transacional e referencial são poderosos, mas um exagero para algumas aplicações. Assim, para aplicações de leitura na sua maioria, uma metáfora do arquivo é bom o suficiente.

Finalmente, você simplesmente não precisa de um banco de dados relacional com a sua linguagem de consulta full-blown se não houver consultas inesperadas antecipados. Se não houver ternos fazendo perguntas como "quantos 5% -discounted widgets azuis fez que vendemos no na costa leste agrupados por vendedor?", E nunca haverá, então, senhor, pode viver livre de DB.

Outras dicas

O paradigma banco de dados relacional faz algumas suposições sobre o uso de dados.

  • Uma relação consiste de um conjunto não ordenado de linhas.
  • Todas as linhas em uma relação tem o mesmo conjunto de colunas.
  • Cada coluna tem um nome fixo e tipo de dados e significado semântico em todas as linhas.
  • linhas em uma relação são identificados por valores originais em coluna chave primária (s).
  • etc.

Estes pressupostos apoiar simplicidade e estrutura, à custa de alguma flexibilidade. Nem todas as tarefas de gerenciamento de dados se encaixam nesse tipo de estrutura. Entidades com atributos complexos ou atributos de variáveis ??não, por exemplo. Se você precisa de flexibilidade em áreas onde uma solução de banco de dados relacional não apoiá-lo, você precisa usar um tipo diferente de solução.

Existem outras soluções para o gerenciamento de dados com requisitos diferentes. tecnologia de Web Semântica, por exemplo, permite que cada entidade para definir seus próprios atributos e ser auto-descritivo, tratando metadados como atributos assim como de dados. Esta é mais flexível do que a estrutura imposta por um banco de dados relacional, mas essa flexibilidade vem com um custo de sua própria.

No geral, você deve usar a ferramenta certa para cada trabalho.

Veja também a minha outra resposta para " bancos de dados The Next-gen . "

Há três modelos de dados principais (C.J.Date, E.F.Codd) e eu estou adicionando um arquivo simples para isso:

  • arquivo plano (s) (estrutura varia - de texto flat 'estúpido' para arquivos em conformidade com gramáticas que juntamente com ferramentas inteligentes fazem coisas muito inteligentes, acho que compiladores e que eles podem fazer, a aplicação estreita em modelar coisas novas)
  • hierárquica (árvores, conjuntos aninhados - Exemplos: XML e outras Linguagens de marcação, registro, organizacional gráficos, etc, qualquer coisa pode ser modelada, mas as regras de integridade não são fáceis de expressar e recuperação é difícil para otimizar automaticamente, alguns de recuperação é rápido e alguns é muito lento)
  • rede (redes, gráficos - exemplos: bases de dados de navegação, hiperlinks, web semântica, novamente quase nada pode ser modelada, mas otimização automática de recuperação é um problema)
  • relacional (primeira ordem lógica de predicados - exemplo: bancos de dados relacionais, otimização automática de recuperação)

Ambos hierárquico e rede podem ser representados em relacional e relacional pode ser expresso nas outras duas.

A razão pela qual relacional é considerado 'melhor' é a natureza declarativa e padronização, não só sobre os dados linguagem de recuperação, mas também sobre a linguagem de definição de dados, incluindo o forte integridade dos dados declarativa, apoiados por estável , escalável, sistema de gestão multi-usuário.

Benefícios têm um custo, que a maioria dos projetos encontram para ser uma boa relação para sistemas (vários aplicativos) que armazenam dados de longo prazo em um de que será utilizável no futuro previsível.

Se você não está construindo um sistema, mas uma única aplicação, talvez para um único usuário, e você está bastante certo de que você não vai querer múltiplas aplicações usando seus dados, nem vários usuários, a qualquer hora em breve, então você provavelmente vai encontrar mais rapidamente se aproxima.

Além disso, se você não sabe que tipo de dados que deseja armazenar e como modelá-lo forças modelo, em seguida, relacionais são desperdiçados sobre ele.

Ou se você simplesmente não se preocupam com a integridade de seus dados que muito (o que pode ser bom).

Todas as estruturas de dados são otimizados para um certo tipo de uso, somente relacional se tentativas adequadamente modelados para representar a 'realidade' de forma semanticamente imparcial. Pessoas que tinham má experiência com bancos de dados relacionais geralmente não percebem que sua experiência teria sido muito pior com outros tipos de modelos de dados. implementações horríveis são possíveis, e especialmente com bancos de dados relacionais, onde é relativamente fácil construir modelos complexos, você pode acabar com um grande monstro em suas mãos. Ainda assim, eu sempre me sinto melhor quando eu tento imaginar o mesmo monstro em XML.

Um exemplo de como bom modelo relacional é, IMO, é a relação de complexidade vs falta das perguntas que você vai achar que envolvem SQL.

Eu sugiro que você visite o alta escalabilidade blogue , que discute este tema quase diariamente e tem muitos artigos sobre projetos que escolheu distribuídos hashes, etc. sobre RDMBS.

A rápida (mas resposta muito incompleto) é que nem todos os dados traduz bem a mesas de formas eficientes. Por exemplo, se os seus dados é essencialmente um grande dicionário, há provavelmente muito mais rápido alternativas que RDBMS antigos simples. Dito isto, é principalmente uma questão de desempenho, e se o desempenho não é uma preocupação enorme em um projeto, e estabilidade, consistência e confiabilidade, por exemplo, são, então eu não vejo muito sentido em se aprofundar estas tecnologias quando RDBMS é um esquema muito mais maduro e bem desenvolvido, com suporte em todos os idiomas e plataformas e um enorme conjunto de soluções para escolher.

Quinze anos atrás eu estava trabalhando em um sistema de risco de crédito (basicamente um grande sistema de andar de árvore). Estávamos usando Sybase no HPUX e Solaris e performnce estava matando gente. Nós contratamos consultores diretos do Sybase que disseram que não poderia ser feito. Então nós mudamos para um banco de dados OO (loja de objetos, neste caso) e tem um sobre um aumento de 100x desempenho (e o código foi de cerca de 100x mais fácil de escrever também)

Mas tais situações são bastante raras - um banco de dados relacional é uma boa primeira escolha

.

Quando você esquema varia muito, você terá um tempo duro com bancos de dados relacionais. Este é o lugar onde os bancos de dados XML ou bancos de dados de pares de valor-chave funcionam melhor. ou você pode usar o IBM DB2 e têm ambos os dados de dados e XML relacionais gerenciados por um único motor de banco de dados.

Cerca de 7-8 anos atrás eu trabalhei em um web site que cresceu em popularidade para além das nossas expectativas iniciais e got em termos de performance problemas. Desde que foram todos relativamente inexperiente em projetos baseados na web que representava uma pressão significativa sobre nós sobre o que fazer além separação de banco de dados de costume para servidor separado, balanceamento de carga etc.

Um dia eu pensei em algo muito simples. Desde local foi baseada em usuários, seus perfis foram armazenados em uma tabela de banco de dados do habitual maneira que alguém iria fazê-lo - id usuário, muitas informações variáveis ??e coisas assim - que aparecem como uma página de perfil usuários que outros usuários podem olhar para cima . Eu lavada todos os dados em um arquivo HTML simples, já preparados como uma página de perfil usuários e tem um impulso significativo - basicamente um cache. Eu até fiz um sistema que quando o usuário editou o seu informações de perfil, seria analisar o arquivo html original, colocá-lo para editar e, em seguida, lavar html de volta para o sistema de arquivos - ficou ainda mais impulso.

Eu fiz algo simillar com os usuários mensagens enviadas para o outro. Basicamente onde quer que eu poderia fazer um sistema de derivação um banco de dados completo, evitando um INSERT ou UPDATE, eu tenho um impulso significativo. Pode soar como um senso comum, mas foi um momento esclarecedor. Não é uma fuga de configuração relacional per se, mas é uma fuga da base de dados completamente - KISS.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top