2016-07-01 3 views
0

У меня есть некоторые проблемы с архитектурой базы данных. Я делаю простой интернет-магазин самостоятельно. Я не знаю, как сделать логическую базу данных. меня Пользователь, Корзина, CartItem, Pruduct и Order таблицы.Простая схема базы данных для магазина

Мои отношения:

пользователя OneToOne Корзина
Корзина OneToMany CartItem
CartItem ManyToOne Продукт

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

С наилучшими пожеланиями. Корзина

Entity 
public class Cart { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer id; 
@OneToMany(mappedBy = "cart", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
private List<CartItem> cartItems; 
@OneToOne 
private User user; 
private Double grandTotal; 

public Cart(List<CartItem> cartItems) { 
    this.cartItems = cartItems; 
} 

public Cart(Double grandTotal) { 
    this.grandTotal = grandTotal; 
} 

public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public List<CartItem> getCartItemsl() { 
    return cartItems; 
} 

public void setCartItemsl(List<CartItem> cartItemsl) { 
    this.cartItems = cartItemsl; 
} 

public User getUser() { 
    return user; 
} 

public void setUser(User user) { 
    this.user = user; 
} 

public Double getGrandTotal() { 
    return grandTotal; 
} 

public void setGrandTotal(Double grandTotal) { 
    this.grandTotal = grandTotal; 
} 
} 

CartItem

@Entity 
public class CartItem { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer id; 
@ManyToOne 
@JsonIgnore 
private Cart cart; 
@ManyToOne 
private Product product; 
private Integer quantity; 
private Double totalPrice; 

public CartItem() { 
} 

public CartItem(Integer quantity, Double totalPrice) { 
    this.quantity = quantity; 
    this.totalPrice = totalPrice; 
} 

public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public Cart getCart() { 
    return cart; 
} 

public void setCart(Cart cart) { 
    this.cart = cart; 
} 

public Product getProduct() { 
    return product; 
} 

public void setProduct(Product product) { 
    this.product = product; 
} 

public Integer getQuantity() { 
    return quantity; 
} 

public void setQuantity(Integer quantity) { 
    this.quantity = quantity; 
} 

public Double getTotalPrice() { 
    return totalPrice; 
} 

public void setTotalPrice(Double totalPrice) { 
    this.totalPrice = totalPrice; 
} 

}

Продукт

@Entity 
public class Product { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer id; 
private String name; 
private String description; 
private Float price; 
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
private Category category; 
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
private List<CartItem> cartItemList; 
private boolean available; 

public Product() { 
} 

public Product(String name, String description, Float price, Category category, boolean available) { 
    this.name = name; 
    this.description = description; 
    this.price = price; 
    this.category = category; 
    this.available = available; 
} 

public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public Float getPrice() { 
    return price; 
} 

public void setPrice(Float price) { 
    this.price = price; 
} 

public Category getCategory() { 
    return category; 
} 

public void setCategory(Category category) { 
    this.category = category; 
} 

public List<CartItem> getCartItemList() { 
    return cartItemList; 
} 

public void setCartItemList(List<CartItem> cartItemList) { 
    this.cartItemList = cartItemList; 
} 

public boolean isAvailable() { 
    return available; 
} 

public void setAvailable(boolean available) { 
    this.available = available; 
} 

}

+0

В чем разница между товаром и карточкой? для меня они кажутся, что они должны быть одинаковыми – niceman

+0

@niceman, только потому, что продукт существует (т. е. имеет запись «Продукт»), не означает, что он находится в корзине (т. е. имеет запись «CartItem»). –

+0

Хммм Я вижу, пропустил это @JonathanM – niceman

ответ

1

Когда пользователь завершает покупку, вы пишете ее в таблице заказа, и вы пишете корзину пользователя для заказов. В заказе должен быть адрес фактуры и адрес доставки в записи заказа.

При необходимости вы также можете написать информацию о платежах пользователей в таблицу Customer и таблицу доставки. (У одного клиента может быть много адресов доставки) Возможно, соблазн не включать эту информацию в запись заказа и ссылку на эти записи - не делайте этого. Существует множество осложнений, которые могут возникнуть, но, короче говоря, информация для конкретного заказа должна оставаться частью заказа.

Таким образом, все таблицы, которые необходимо сохранить в исторических целях заказов, полностью отделены от таблиц, используемых для покупок.

Так звучит, что ваша «корзина» - это действительно начало «заказа» с текущими итогами. Это круто, но вы можете назвать его чем-то другим.

Важно то, что элементы корзины должны периодически проверять таблицу продуктов, чтобы подтвердить цену, и подтвердить, что продукт все еще на складе. Любая из этих вещей может создать огромные проблемы для магазина, особенно если клиент заказывает что-то, что ушло в отставку. Магазин может потерять всю свою прибыль в период обслуживания клиентов, который требуется, чтобы связаться с клиентом, и, если они могут убедить клиента приобрести другой товар.И, очевидно, если цена продукта выросла, то магазин теряет эти деньги при продаже.

Таким образом, единственная ответственность, которую несет Корзина (повозка), состоит в том, чтобы удерживать продукт sku (номер позиции) и количество. Тележка может удерживать цену за дисплей, но не несет ответственности за цену. Как минимум, тележка должна проверять таблицу продуктов по ценам и уровням запасов после получения информации о доставке и до окончательного клика для создания транзакции.

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

Другой идеей является, например, сохранение информации о доставке в процессе заказа пользователю. Другими словами, они отправили информацию о доставке, но транзакция еще не прошла. Таким образом, если они никогда не завершат покупку, что происходит очень много - вы не тратите ни на какие ресурсы, которые пишут в таблицу доставки. И если вы только пишете в таблицу доставки для завершенных заказов, то каждая запись действительна. Такая же идея для выставления счетов.

+0

Благодарим вас за подробное объяснение. Я искал эту информацию! Теперь я четко понимаю логику покупки. Если мы встретимся в реальной жизни, я куплю вам пиво) –