É má ideia criar chaves estrangeiras nas tabelas em esquemas diferentes no mesmo banco de dados para grandes aplicativos?


13

Estou trabalhando na transferência de um grande aplicativo baseado na web pl / sql para o servidor dedicado. Este aplicativo está localizado em um esquema com 70 pacotes de código de programa. Esta aplicação foi feita aproximadamente 15 pessoas em diferentes épocas. E era prática normal para nós criar chaves estrangeiras nas tabelas de referência em diferentes esquemas, porque é realmente conveniente e mantém o banco de dados muito limpo, porque não precisamos manter as mesmas tabelas de referência em esquemas diferentes.

Mas, de qualquer maneira, meu DBA (que criou uma nova instância com o DB e copiou meu aplicativo dentro da zona Solaris) disse muito duro hoje: "Chaves estrangeiras nos diferentes esquemas são más e você precisa destruí-las!". Ele não explicou seu ponto de vista.

É realmente péssima fazer isso com grandes aplicativos?


13
Seu DBA deve ser demitido.
Colin 't Hart

1
Todos nós vamos gritar que seu DBA é um idiota, se é tudo o que eles disseram, mas você tem certeza de que não havia outro contexto no argumento do seu DBA?
Kermit

1
talvez o DBA esteja fazendo o melhor possível para apoiar o trabalho ridículo que os desenvolvedores fizeram na construção dessa coisa.
swasheck

2
@swasheck Por outro lado, você quer ter o emprego dele depois que o banco de dados acumular vários anos de inconsistências nesse DBA?
Twinkles

@Twinkles not at all
swasheck

Respostas:


6

Tenha paciência comigo - venho do SQL Server e odeio a Oracle, mas acho que a argumentação ainda permanece.

Esquema é bom para isolar tabelas de subsistemas lógicos. Chaves estrangeiras garantem a integridade dos dados. Esses são conceitos ortogonais - como obviamente a integridade dos dados entre os subsistemas também é essencial. Contabilidade e remessa e, possivelmente, os dados do cliente central não vivem em silos onde um cliente pode ser excluído enquanto estiver sendo usado na contabilidade.

Como tal, acho que o requisito do DBA é um sinal de incompetência. Por favor, qualquer um pode intervir e fornecer um contra-argumento - eu ficaria feliz. Mas é assim que faço no SQL Server (embora, novamente, nossa definição de esquema seja IIRC um POUCO diferente da definição de oracle).


4

Embora seja tolo exigir a destruição de restrições de chave estrangeira sem um raciocínio detalhado, faz sentido manter as referências externas sob controle. E se os esquemas que você está referenciando tiverem um nome diferente no seu novo servidor?

No Oracle, você resolve esse problema criando SYNONYMS para objetos que estão fora do esquema atual.


1
Você pode usar sinônimos demais e enlamear ainda mais a pergunta "a que isso se refere?". Consulte aqui para obter mais detalhes sobre segurança, desempenho e práticas recomendadas stackoverflow.com/a/10042117/851930
kevinsky

3
Os sinônimos não podem ser usados ​​como alvo de restrições de chave estrangeira.
Colin 't Hart

Pontos válidos. E mais uma prova de que fazer declarações sem dar aos outros a oportunidade de discutir os méritos e os perigos é ruim.
Twinkles

2

Se você precisar (espaço / segurança / o que for) de mover qualquer esquema para um banco de dados diferente, não poderá mais lidar com as referências. Essa é provavelmente a principal razão para solicitar a eliminação das referências.


0

A única "má idéia" que posso imaginar ao fazer isso é que você não pode conceder o privilégio do objeto REFERENCES (aquele necessário para criar uma restrição que se refere a uma tabela) a uma função. Eu tenho que ser feito esquema / usuário por esquema / usuário.

Além disso, não vejo o objetivo do seu DBA.


0

Basta pensar no seguinte: O esquema do proprietário da tabela filho começa a criar registro em sua tabela e, sem saber, impede o usuário do esquema da tabela pai de excluir registros da tabela pai. É algo que antecipa e aprecia?

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.