Я создаю систему управления логистикой с использованием Spring Boot и JPA и пытаюсь правильно спроектировать базу данных для отправлений.
Каждая отгрузка создается зарегистрированной компанией (отправителем), а получателем может быть:
Другая зарегистрированная компания в системе (B2B) или
An внешний клиент, не зарегистрированный на платформе (B2C).
Вот моя текущая модель:
Код: Выделить всё
@Entity
public class Shipment {
@Id
private UUID id;
@ManyToOne
@JoinColumn(name = "sender_id")
private Company sender;
@ManyToOne
@JoinColumn(name = "receiver_id")
private Company receiver; // problem: sometimes receiver is external
private String source;
private String destination;
}
Когда получатель является внешним, нет записи компании, на которую можно было бы ссылаться.
Позволение приемнику_id иметь значение null или неправильное использование приводит к несогласованности и нарушает нормализацию.
Я хочу спроектировать эту таблицу так, чтобы:
Отправитель всегда зарегистрированная компания.
Получателем может быть:
Другая зарегистрированная компания или
Внешний клиент (имя, телефон, адрес).
Модель должна оставаться нормализованной, масштабируемой и совместимой с JPA.
Вариант 1: Полиморфная ассоциация
Код: Выделить всё
@Entity
public class Shipment {
@Id
private UUID id;
@ManyToOne
@JoinColumn(name = "sender_id")
private Company sender;
private Long receiverId;
private String receiverType; // 'COMPANY' or 'EXTERNAL'
}
Код: Выделить всё
@Entity
public class ExternalReceiver {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String phone;
private String address;
}
Рекомендуется ли этот подход полиморфной ассоциации для JPA/MySQL?
Существуют ли какие-либо более чистые альтернативы (отображение наследования, таблицы соединения, столбцы дискриминатора и т. д.), используемые в подобных реальных системах?
Как я могу эффективно запрашивать отправления с полной информацией о получателе (внутреннем или внешнем) с помощью Spring Data JPA?
Java 17
Spring Boot 3.x
Spring Data JPA (Hibernate)
MySQL 8
Подробнее здесь: https://stackoverflow.com/questions/797 ... stered-com
Мобильная версия