Как устанавливается связь (зависимость) между таблицами в реляционной базе данных?

«Как устанавливается связь (зависимость) между таблицами в реляционной базе данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Связь между таблицами устанавливается с помощью внешних ключей (Foreign Keys, FK). Внешний ключ в дочерней таблице ссылается на первичный ключ (Primary Key, PK) или уникальный ключ в родительской таблице.

Ключевые аспекты:

  • Целостность данных: СУБД обеспечивает ссылочную целостность, предотвращая операции, которые нарушили бы связь (например, удаление родительской записи, на которую есть ссылки).
  • Типы связей: Один-ко-многим (One-to-Many), многие-ко-многим (Many-to-Many, через связующую таблицу), один-к-одному (One-to-One).

Пример на SQL:

-- Родительская таблица
CREATE TABLE customers (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

-- Дочерняя таблица с внешним ключом
CREATE TABLE orders (
    id INT PRIMARY KEY,
    customer_id INT, -- Внешний ключ
    amount DECIMAL,
    FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE
);

Пример на JPA/Hibernate:

@Entity
public class Customer {
    @Id
    private Long id;

    @OneToMany(mappedBy = "customer") // Обратная сторона связи
    private List<Order> orders;
}

@Entity
public class Order {
    @Id
    private Long id;

    @ManyToOne // Владеющая сторона связи
    @JoinColumn(name = "customer_id") // Столбец внешнего ключа
    private Customer customer;
}

Каскадные операции (например, CascadeType.ALL, ON DELETE CASCADE) позволяют автоматически распространять действия (удаление, обновление) с родительской записи на дочерние.