Как лучше всего связать продукты с заказом в приложении Spring? - PullRequest
0 голосов
/ 27 августа 2018

Я занимаюсь разработкой простого приложения Spring Boot, предлагающего сервис REST, чтобы позволить клиентам входить в систему и заказывать некоторые продукты.

В моей базе данных MySQL у меня есть следующие таблицы:

Клиент ПродавецЗаказать товар в магазине

Пользователь может выбрать несколько товаров, добавить их в корзину и нажать «Перейти к оформлению заказа».До этой части все было идеально, но теперь я не уверен, как поступить.

Я включу только часть отношений, чтобы дать вам более ясное представление о моем коде:

ДляКласс модели изделия:

@JoinColumn(name = "shop_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Shop shop;

@JoinColumn(name = "order_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Order order;

Для класса модели заказа:

@JoinColumn(name = "user_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private User user;

@JoinColumn(name = "shop_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Shop shop;

Для класса модели магазина:

@JoinColumn(name = "user_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private User user;

Теперь мне нужно сделатьВызов REST POST, чтобы создать заказ, это решения, о которых можно подумать, но я не уверен, что любое из них является правильным:

Первое решение:

  • Я создаю новую таблицу с именем "ordred_products"
  • Когда пользователь делает заказ, я отправляю POST-запрос для создания заказа, а затем я делаю POST-запрос для создания элемента "order_products", которыйбудет иметь заказанные продукты в виде набора, но я не знаю, как их сопоставить.

Второе решение:

  • Я держу толькотаблицу заказов и добавьте к ней набор заказанных товаров.

Я был бы благодаренкто-то может объяснить мне правильный способ сделать это, поскольку я только изучаю REST и отношения между сущностями.

Большое вам спасибо.

1 Ответ

0 голосов
/ 27 августа 2018

Как обычно выполняются заказы, с помощью line_items.Заказы имеют несколько line_items.Каждый line_item должен иметь product_id из таблицы Product, количество и order_id из таблицы Order.

  +------------+       +-----------------+        +---------------+
  |   Order    |       |    Line_Item    |        |    Product    |
  +------------+       +-----------------+        +---------------+
  | id         |       | id              |        | id            |
  | date       |       | quantity        |        | name          |
  | paid       |       | price           |        | description   |
  +------------+       | product_id      |        +---------------+
                       | order_id        |
                       +-----------------+

Таким образом, таблица Line_item имеет отношение «много к одному» с Product и множество.to-one с Заказом.

Когда пользователь добавляет товар в корзину, создается новый line_item.С этой настройкой продукты могут быть легко перемещены из заказа.Все элементы line_items тесно связаны с ордером, и каскад должен быть удален при удалении ордера.Заказ можно легко очистить, просто удалив все элементы line_items, связанные с этим заказом.

В коде это будет выглядеть так:

class Order {
    @Id
    long id;
    Date date;
    boolean paid;

    @OneToMany
    List<LineItem> lineItems;
}

class LineItem {
    @Id
    long id;
    int quantity;

    @ManyToOne
    Order order;

    @ManyToOne
    Product product;
}

class Product {
    @Id
    long id;
    String name;
    String description;
    BigDecimal price;

    // Product does not need
    // to know about line_items
}

Вот как я реализовал приложение для покупок перед

Существует понятие Корзина и Заказ.Эти два разных, но содержат в основном одну и ту же информацию.Это может показаться излишним, но я чувствовал, что это самый чистый способ представить реальность.Пользователь должен иметь только одну корзину, но может иметь несколько заказов.Когда пользователь выписывается, вся информация из корзины покупок переносится в новый Заказ и корзина очищается.

Сущности

Order       Order_Item      Product      Shopping_Cart     Cart_Item
-----       ----------      -------      -------------     ---------
id          id              id           id                id
date        quantity        name         user_id           quantity
user_id     product_id      description                    product_id
            order_id        price                          cart_id

Вы можетевидим, что Order и Order_Item похожи на Shopping_Cart и Cart_Item.Когда пользователь начинает делать покупки, для него инициализируется корзина.Когда они добавляют товар в корзину, создаются элементы Cart_Items, связанные с Shopping_Cart.Когда пользователь выписывается, создается Заказ, и данные Shopping_Cart переносятся в Заказ, а все Cart_Items передаются в Order_Items, связанные с Заказом.Корзина Shopping_Cart очищается простым удалением всех элементов Cart_Items.

...