Eu tenho uma entidade que não possui nenhuma chave primária natural. Uma linha única é identificada por três colunas, qualquer uma das quais pode ter um valor único e as outras colunas serão nulas.
Para fins de exemplo imaginário, aqui está minha entidade:
--------
Product
--------
Shelf
Order
Customer
Category
--------
Apenas uma coluna de Prateleira ou Ordem de Cliente ou Categoria terá um valor preenchido, provavelmente com um ID (não será um FK de outra tabela).
Como faço para projetar uma mesa para isso? Preciso estritamente identificar linhas exclusivas somente nessas colunas. Estou usando o Oracle DB se isso ajudar.
Você provavelmente não pode.
Isso é um empecilho . Embora você PODE criar uma chave composta exclusiva nessas 4 colunas, tudo ficará bem até que você tente inserir outra linha que já contenha essa combinação.
Por exemplo:
Esta linha falhou porque essa combinação já existe (foi a primeira linha que inseri).
Se estiver tudo bem para você - quero dizer, você realmente espera que algo assim aconteça - então funcionará. Se não, não vai.
Você pode fazer isso criando uma restrição exclusiva (não uma chave primária). Restrições exclusivas permitem que seus membros de coluna sejam capazes de NULL, tratando NULL como um valor distinto. Isso é útil principalmente quando a coluna anulável é algum tipo de indicador de estado/moeda (por exemplo, um NULL
end_date
pode significar uma linha atualmente ativa em uma tabela histórica do tipo 2, e a restrição impõe que nenhuma entidade tenha mais de um NULLend_date
, ou seja , mais de uma linha ativa/atual). Se você quisesse criar uma restrição, você diria:No entanto, a sua situação particular não se presta a isso. Honestamente, não consigo imaginar por que você teria um design em que prateleira , pedido , cliente e categoria seriam todos anuláveis, nem por que você teria um valor de identificação em apenas um deles, nem por que a coluna com um valor de identificação mudaria em volta. Nenhuma delas, exceto talvez order , soa como uma coluna de identificação, nem a combinação delas. Não faz sentido que apenas um deles tenha valor e os outros não. Esta é uma falha de design definitiva que deve ser corrigida redesenhando sua(s) tabela(s).
Corrija seu design para que você tenha uma chave de identificação adequada ou simplesmente não tente criar qualquer tipo de chave. As tabelas não precisam ter restrições. Mas eu suspeito que você provavelmente deveria consertar o design para que você faça isso.