Я создаю api rest приложения для торговой площадки с помощью Spring Boot и использую PostgreSQL. Есть продукты, добавленные администратором, и продавцы добавляют свои собственные спецификации к этим продуктам. Существует связь между продуктами и категориями, и есть связь между продуктами и спецификациями продуктов, также есть связь между продуктами и продавцами, и есть связь между спецификациями продуктов и продавцами. Мне нужно отфильтровать категории и продукты по продавцу, поэтому, если покупатель просматривает профиль продавца, я просто хочу указать категории продуктов продавца и их характеристики. Я пытаюсь реализовать это с PostgreSQL, но работает очень медленно. И я не хочу отношений между категориями и торговцами. Я думаю, что это может быть с Elasticsearch, какую структуру я должен использовать в Elasticsearch для этого. Если я создам такой документ, как «Продукты в Elasticsearch», и продукты включают всю категорию, продавцы и я фильтруем товары по торговцам, это будет хорошим способом?
Модели, которые я использую для PostgreSQL
Категория:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotBlank
private String name;
@NotBlank
private String photoUrl;
private boolean subCategory;
private double commission;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@ManyToOne
@JoinColumn(name = "parent_id")
private Category parent;
@OneToMany(mappedBy = "parent",cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy("id desc")
private List<Category> childs;
@JsonIgnore
@OneToMany(mappedBy = "category",cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.LAZY)
@OrderBy("id desc")
private List<Product> products;
Продукт:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private UUID uuid;
@NotBlank
@Column(unique = true)
private String name;
@NotNull
private double tax;
private String photoUrl;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "category_id",referencedColumnName = "id")
private Category category;
private boolean status;
private double commission;
@OneToMany(mappedBy = "product",cascade = CascadeType.ALL,orphanRemoval = true)
@OrderBy("id desc")
@EqualsAndHashCode.Exclude
private Set<ProductSpecify> productSpecifies;
@OneToMany(mappedBy = "product",cascade = CascadeType.ALL,orphanRemoval = true,fetch = FetchType.EAGER)
@OrderBy("id desc")
@EqualsAndHashCode.Exclude
private Set<Barcode> barcodes;
@ManyToMany
private List<User> users;
ProductSpecify:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private UUID uuid;
@NotNull
private double totalPrice;
@NotNull
private double unitPrice;
@NotNull
private int quantity;
@NotNull
private double contents;
@NotNull
@Enumerated(EnumType.STRING)
private UnitType unitType;
private double commission;
@NotNull
private double recommendedRetailPrice;
@ManyToOne
@JoinColumn(name = "product_id",referencedColumnName = "id")
private Product product;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id",referencedColumnName = "id")
private User user;
@ManyToMany(fetch = FetchType.EAGER)
private List<State> states;