Digamos que eu tenha uma tabela Conta que contém nome de usuário e senha de usuários para fazer login: -
account (
account_id BIGINT PRIMARY KEY,
username VARCHAR(30),
password VARCHAR(30)
)
-- I have two more tables that stores their credentials in the above table:-
customer (
delivery_address VARCHAR(100),
account_id FOREIGN KEY,
..30 more customer columns
)
admin (
sp_admin_code INT,
account_id FOREIGN KEY,
..30 more admin columns
)
Um administrador não pode ser cliente e usar o mesmo nome de usuário e senha para fazer login como cliente.
Minhas perguntas:-
Esta é a maneira correta de implementar esse tipo de relacionamento? Se não, o que é?
Preciso adicionar alguma restrição na chave primária da tabela de contas para indicar que sua entrada única pode ser referenciada pela tabela de clientes ou pela tabela de administração de uma só vez?
Agora também sabemos que uma entrada na conta só pode existir se houver uma entrada para ela na tabela do cliente ou na tabela do administrador e vice-versa. Então, precisamos ou se quisermos adicionar alguma cascata/restrição, como fazemos ou como devemos fazer ou se devemos fazer? desculpe, estou confuso..
obrigado!
Não há restrições para fazer isso em nenhum RDBMS que eu conheça ...
A maneira tradicional é simplesmente sair do banco de dados. Tenha um campo
admin_or_customer
naaccount
tabela e deixe a aplicação cliente ler uma tabela ou outra de acordo com esse campo. É possível, nesse cenário, ter registros em ambas as tabelas concorrentes com o mesmoaccount_id
, mas se o seu aplicativo cliente sempre for doaccount
primeiro - a linha "errada" se tornará órfã oculta e não desempenhará nenhum papel. Você também pode fazer uma limpeza regular desses órfãos.É possível adicionar
insert, update
gatilhos em tabelasadmin
ecustomer
, para que eles façam check-in do sinalizadoraccount
e evitem a criação de uma nova linha ou modificação deaccount_id
campo se ele entrar em conflito com o sinalizador ou se uma linha com talaccount_id
já existir em outra tabela.Outro gatilho pode ser criado em
account
, que criaria/excluiria/moveria automaticamente registros entreadmin
ecustomer
de acordo com o sinalizador.