При таких отношениях вам вряд ли понадобятся две таблицы. Между ними есть связь 1-1, даже при удалении. Это довольно близко к тому, чтобы сказать, что это одно и то же. Обычно клиенту разрешается иметь два аккаунта. Или клиенты могут существовать без активных учетных записей.
Один из способов - возвратные внешние ключи:
create table customers as (
customerId identity(1, 1) primary key,
accountId int not null,
. . .
);
create table accounts as (
accountId identity(1, 1) primary key
customerId int not null references customers(customerId)
. . .
);
alter table customers add foreign key (accountId) references accounts(accountId) on delete cascade;
(я просто использовал identity()
для удобства.)
Однако вы обнаружите, что вставка и удаление строк действительно сложны, потому что ссылки в этих двух таблицах должны синхронизироваться. Вы можете обойти это, используя транзакции или триггеры, или, в некоторых случаях, используя обновляемые представления.
Другой метод - сделать одну таблицу более «доминирующей» и разделить первичный ключ между ними:
create table customers as (
customerId identity(1, 1) primary key,
accountId int not null,
. . .
);
create table accounts as (
customerId int primary key references customers(customerId)
. . .
);
Это не совсем завершает отношения. Это не гарантирует, что у всех клиентов есть соответствующий аккаунт. Если вы попытаетесь восстановить эти отношения, у вас возникнет проблема с модификациями данных.
Наконец, вы можете просто создать одну таблицу, CustomerAccounts
. Это действительно решит вашу проблему. Все столбцы могут помещаться в одну таблицу, и операции удаления и вставки двух «сущностей» будут автоматически синхронизированы.