Как я могу реализовать таблицу клиентов и счетов, показанную на диаграмме ER в SQL

Как реализовать таблицу клиентов и счетов, показанную на диаграмме ER в SQL.

  1. Каждый клиент имеет ровно 1 аккаунт.
  2. Каждый аккаунт принадлежит ровно 1 клиенту.
  3. При удалении клиента, соответствующая строка учетной записи также должна быть удалена

1 ответ

С этими отношениями вам вряд ли понадобятся две таблицы. Между ними есть связь 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, Это действительно решит вашу проблему. Все столбцы могут помещаться в одну таблицу, а удаления и вставки двух "сущностей" будут автоматически синхронизированы.

Другие вопросы по тегам