#database-design #shopping-cart
#база данных-дизайн #корзина покупок
Вопрос:
Хорошо, итак, в настоящее время я создаю простую корзину покупок для своего веб-сайта и исследовал этот вопрос, но не смог найти ответ.
У меня пока есть эти таблицы:
Item
------
id
categoryID
brandID
name
price
Categories
-----------
id
name
Brands
-------
id
name
Shopping Carts
--------------
id
userID
itemIDs
itemPrices
itemQuantities
Основываясь на других ответах, которые я нашел, это кажется правильным способом, за исключением того, что я не уверен в таблице корзины покупок. Я рассматривал возможность хранения информации в этой таблице следующим образом:
id: 1
userID: 1
itemIDs: 1;2;3;5
itemPrices: 40;50;60;70
itemQuantities: 1;2;3;4
Это правильный способ решения этой проблемы или есть способ получше? (Я также думал об использовании функции explode () в PHP для разделения данных, когда я буду их извлекать.)
Комментарии:
1. вау. В чем ваш вопрос? Хорош дизайн или нет?
2. Хорошо ли сохранять значения в itemIds, itemPrices и itemQuantities или нет. Смотрите мой пример и то, как я использую точки с запятой.
Ответ №1:
В идеале вы хотите хранить информацию о корзине покупок либо в файлах cookie, либо в сеансах. Если вы хотите сохранить каждую корзину покупок в своей базе данных, вы могли бы использовать следующую реализацию.
По сути, в одной корзине покупок может быть несколько товаров, с каждым товаром связана цена и количество.
Для хранения корзин для каждого пользователя используйте эту схему:
Корзины покупок
cartID (первичный ключ)
SessionID (уникальный идентификатор, идентифицирующий сеанс пользователя, в котором была создана корзина)
приобретено (логическое значение TRUE / FALSE для сохранения того, была ли корзина приобретена или выброшена)
Элементы корзины покупок
идентификатор (первичный ключ)
cartID (уникальный идентификатор, идентифицирующий пользовательскую корзину)
Идентификатор пользователя: (используйте, только если вы знаете, что пользователь всегда будет входить в систему при добавлении товаров в корзину)
ItemId: Уникальный идентификатор товара в корзине.
Количество товара: количество заказанного товара.
Цена товара: (необязательно — используйте, только если цена товара настраивается, или извлекайте ее из таблицы товаров)
С помощью приведенной выше схемы, если пользователь добавляет 2 товара в вашу корзину, допустим
- товар X (количество = 2шт, ItemId = 1001) amp;
- товар Y (количество = 1шт, ItemId = 1002).
Ваши записи в таблице будут выглядеть следующим образом:
идентификатор: 1
Идентификатор сеанса: abc1
ItemId: 1001
Количествотоваров: 2
идентификатор: 2
Идентификатор сеанса: abc1
ItemId: 1002
Количество товаров: 1
Теперь, когда вы хотите получить заказ для корзины покупок — просто запросите на основе идентификатора сеанса, который использовался, когда пользователь создавал корзину.
Комментарии:
1. Так что, лучше иметь много строк элементов, чем хранить все это в одной и позволять PHP анализировать это?
2. С точки зрения нормализации — да. Таким образом, вы также можете запускать статистические SQL-запросы, которые возвращают, сколько товаров X было помещено в корзину, и сколько фактически было заказано и т.д. Отношения один-> Много довольно распространены при проектировании баз данных, и это не исключение.
3. Кроме того, должен ли я очищать эту таблицу всякий раз, когда она становится слишком большой? Я имею в виду, что я хотел хранить все заказы пользователя бесконечно долго, но это не казалось бы правдоподобным.
4. Не обязательно. Я обновил свой ответ, который упрощает отслеживание корзин для каждого пользователя и имеет время истечения срока действия для каждой корзины. конечно, это всего лишь одна из многих реализаций, которые вы могли бы сделать, чтобы установить время истечения срока действия в корзине.
5. Но я не хочу, чтобы срок действия корзины истек. Потому что я подумываю о добавлении дополнительного поля, которое является: «куплено». Чего я боюсь, так это того, что таблица просто станет очень-очень большой.
Ответ №2:
Нет, обычно это не очень хорошая идея. То, что вы здесь делаете, — это несколько значений в одном поле, и это бесполезно на случай, если вы когда-нибудь захотите запросить это поле.
И для вашей насущной необходимости добавьте новую таблицу, подобную этой:
CartContent
-----------
cartId
itemId
itemCount
Также смотрите http://en.wikipedia.org/wiki/Database_normalization для хорошего руководства по нормализации базы данных.
Ответ №3:
Вам не следует использовать значения, разделенные точкой с запятой, в столбцах, потому что вы не сможете присоединить их к соответствующим внешним таблицам при выполнении запросов к БД. Лучше хранить их как отдельные позиции и иметь таблицу заголовков, которая объединяет эти позиции/