Pergunta

Sou novo no CouchDB e aprendendo sobre isso. Não encontrei suporte ao CouchDB para integridade referencial. Podemos criar uma chave estrangeira para um campo no documento CouchDB?

Por exemplo, é possível garantir que um nome de fornecedor usado em um documento de pedido esteja disponível no banco de dados do fornecedor?

O CouchDB suporta integridade referencial? E é possível fazer um campo em um documento como chave primária?

Foi útil?

Solução

Não, o CouchDB não faz chaves estrangeiras como tal, então você não pode lidar com a integridade referencial do sistema para você. Você precisaria lidar com a verificação de fornecedores no nível do aplicativo.

Se você pode tornar um campo uma chave primária, a chave primária é o campo _ID, mas você pode usar qualquer JSON válido como uma chave para as visualizações no banco de dados. Assim, por exemplo, você pode criar uma visão dos pedidos com o fornecedor como a chave.

algo como

function(doc) {
  if (doc.type == 'order')
    emit(doc.vendor,doc);
}

Pegaria todos os documentos no banco de dados que possuem um atributo de tipo com a ordem de valor e os adicionassem a uma visualização usando seu fornecedor como chave.

Introdução às visualizações do CouchDB

Outras dicas

Essas perguntas são incrivelmente específicas do banco de dados relacionais.

No CouchDB, ou em qualquer outro não RDBMS, você não armazenaria seus dados da mesma maneira que faria em um RDBMS, portanto, projetar o relacionamento dessa maneira pode não ser melhor. Mas, apenas para dar uma idéia de como você pode fazer isso, vamos supor que você tenha um documento para um fornecedor e um monte de documentos para ordens que precisam "relacionar" de volta ao documento do fornecedor.

Não há chaves primárias, os documentos têm um _id que é um UUID. Se você possui um documento para um fornecedor e está criando um novo documento para algo como um pedido, poderá fazer referência aos documentos do fornecedor _ID.

{"type":"order","vendor-id":"asd7d7f6ds76f7d7s"}

Para procurar todas as ordens para um fornecedor específico, você teria um mapa ver algo como:

function(doc) { if (doc.type == 'order') {emit(doc['vendor-id'], doc)}}

O documento _ID não mudará, portanto, há "integridade" lá, mesmo se você alterar outros atributos no documento do fornecedor, como o nome ou as informações de cobrança. Se você colar o nome do fornecedor ou outros atributos do documento do fornecedor diretamente no documento do pedido, precisará escrever um script se quisesse alterá -los a granel.

Espero que ajude um pouco.

Embora não seja possível criar uma restrição de FK, é possível usar o Couch's Validate função

function(newDoc, oldDoc, userCtx, secObj) {
    if(newDoc && newDoc.type) switch(newDoc.type){
        case 'fish':
            var allSpecies = ['trout','goldfish'];
            if(!allSpecies.contains(newDoc.species)){
                throw({forbidden : 'fish must be of a know species'});
            }
            break;
        case 'mammals':
            if(!['M','F'].contains(newDoc.sex)){
                throw({forbidden : 'mammals must have their sex listed'});
            }
            break;
    }
}

Agora, se uma pessoa fosse realmente inteligente (eu não sou), ela pode fazer uma chamada para o próprio banco de dados para a lista de espécies ... isso seria uma chave estrangeira.

Você também pode querer ler em:Como faço para secar minhas visualizações de CouchDB?

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