Отношения между клиентом и заказом в корзине - PullRequest
1 голос
/ 11 апреля 2011

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

Я запутался в отношениях между Заказом и Клиентом.

Если я не ошибаюсь, клиент можетзаказать много продуктов,

1 заказ может сделать заказ

Итак

Create Table OrderProduct(
orderProductId int PRIMARY KEY,
productID int,
Quantity int
)

Create Table Orders( 
OrderId int PRIMARY KEY,
orderProductId int, //foregin key
CustomerId int,
date
)

Я прав, или структура таблицы mu неверна?

Ответы [ 4 ]

4 голосов
/ 11 апреля 2011

В таблице Order есть столбец orderProductId - который не имеет смысла;если подумать, это означает, что Order будет иметь один OrderProduct.

. В таблице OrderProduct должен быть столбец, OrderId - внешний ключ, относящийся к первичному ключу * 1009.* Таблица.Таким образом, вы могли бы иметь 10 OrderProduct записей (обычно называемых строк заказа ) для одного и того же заказа.

С этими проблемами я считаю, что это помогает макетировать некоторые тестовые данные -посмотрим довольно быстро, если получится.

2 голосов
/ 11 апреля 2011

Вот простое и немного еретическое предложение для корзины покупок.

table cart(
   customer_id not null
  ,create_date not null
  ,primary key(customer_id)
  ,foreign key references customers(customer_id) on delete cascade
);

table cart_item(
   customer_id   not null
  ,product_id    not null
  ,quantity      not null
  ,modified_date not null
  ,primary key(customer_id, product_id)
  ,foreign key(customer_id) references cart(customer_id) on delete cascade
  ,foreign key(product_id)  references products(product_id) on delete cascade
);

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

Либо клиент решает НЕ начинать работу с товарами в своей корзине.В этом случае корзина и товары будут оставаться в таблице до тех пор, пока он не вернется и не решит продолжить и заплатить, или пока вы не решите (например, на основании cart.create_date), что пришло время удалить данные..

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

Что касается того, какие ключи должна иметь ваша таблица заказов / строк, она на самом деле зависит отмного вещей, таких как:

  • Можно ли удалить товары, у которых есть заказы?
  • Нужно ли вам точно представлять информацию о продукте (цена, наименование) на момент покупки?
  • Использую ли я таблицу заказа для представления других элементов, таких как скидки / коды кампании и т. Д.
  • Нужно ли точно указывать адрес доставки клиента на момент покупки?(клиент переехал в другую страну, но вы отправили товары на его старое место)

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

1 голос
/ 11 апреля 2011

В заказе может быть несколько продуктов. Вы можете удалить orderProductId из таблицы OrderProuct и сделать productId в качестве первичного ключа. Также для параметра OrderId в качестве внешнего ключа в таблице OrderProduct можно указать сопоставление между Order ипродукты в соответствующем порядке.

1 голос
/ 11 апреля 2011

Мне кажется, что это нормально, но вам нужен OrderId в таблице OrderProduct, чтобы связать детали заказа с заказом - удалите OrderProductId из Orders.

Некоторые другие столбцы, такие как ProductId и CustomerIdконечно, также должны быть внешние ключи.

Является ли "Заказ" завершенным заказом или есть более поздний этап выставления счета?Потому что обычно вы можете захотеть зафиксировать цену за единицу в заказе (из файла продукта на момент заказа или, возможно, из подписанного / утвержденного предложения).

...