Вернуться   Дизайнерский форум » ВЕБ-ПРОГРАММИРОВАНИЕ » ASP, Perl, PHP и MySQL

Как правильно организовать хранение заказов в интернет-магазине

Обсуждение темы Как правильно организовать хранение заказов в интернет-магазине в разделе ASP, Perl, PHP и MySQL, часть категории ВЕБ-ПРОГРАММИРОВАНИЕ; При разработке интернет-магазина пришел к такому вопросу: есть база товаров. Условно назовем их "товар1", "товар2", "товар3" и т.д. В базе хранятся данные о ...


Закрытая тема
 
Опции темы
Старый 21.04.2010, 18:58   #1
При разработке интернет-магазина пришел к такому вопросу:
есть база товаров. Условно назовем их "товар1", "товар2", "товар3" и т.д. В базе хранятся данные о каждом товаре, включая уникальный идентификатор (все как у всех). Есть база данных заказов пользователей (номер заказа, данные о заказчике, данные о доставке, оплате и т.д.). И есть база заказанных товаров, в которой связывается наименование товара (из каталога) с номером заказа к которому он относится. Все это вроде как на поверхности, и вряд ли нужно делать по-другому (хотя, я, конечно, могу и ошибаться). А вопрос вот в чем! В базе заказанных товаров что правильнее хранить: наименования товаров или их идентификаторы??? Сначала я пришел к выводу, что нужно хранить именно названия товаров , а не их идентификаторы. Я пришел к такому выводу так как представил себе такую схему: в базе заказанных товаров хранятся, например, id этих товаров. Тогда при выводе, например, в системе управления заказами, списка заказов и товаров, связанных с ними, скрипт будет извлекать из таблицы заказанных товаров их идентификаторы и по этим идентификаторам уже брать названия товаров из таблицы товаров (из каталога). Все, казалось, бы хорошо. Но вдруг администратор сайта удаляет какое-то наименование товара. А этот товар есть в чьем-то заказе. Тогда получается когда скрипт будет искать в таблице товаров товар с таким id (а он удален), то возникнет ошибка. Понятно, что, может быть удаление товаров - это не такая частая процедура. Но тем не менее, если товар удален, то id такого больше не существует. Значит в заказе (если когда то до удаления данного заказа был заказ с данным товаром) будет храниться несуществующий id, а значит несуществующий товар.
Поэтому то я и решил в заказах хранить не id товаров а их имена. Тогда, как бы мы не чистили, каталог, информация о заказанных товарах останется навсегда. Т.е. чтобы избежать связи таблицы заказанных товаров и таблицы товаров (каталога). И если нужно вывести список заказов и заказанных в них товарах - проблем не будет.
Но меня все равно постоянно гложит этот момент, т.к. осознаю, что неправильно хранить в заказах название товара. Я думал, может быть не давать пользователю удалять те товары из каталога, на которые уже когда-либо были оформлены заказы, но это тоже как-то не правильно...
Может кто подскажет как правильно организовать хранение заказов и наименований заказанных товаров, чтобы не происходило конфликтов при правке каталога товаров.
 
Старый 21.04.2010, 18:58
Ссылки
Старый 22.04.2010, 10:32   #2
Вообще это как-то неправильно, когда товары удаляются вот так по-тупому. Если товар есть в заказах, удалить его нельзя (можно только поставить запрет на новые заказы). Когда же товаров в заказах нет - удаляйте смело. Конечно, хранить в заказах нужно id.

Кстати, если ваша СУБД поддерживает внешние ключи, и вы ими пользуетесь, то товар она вам удалить так просто не позволит.
 
Старый 22.04.2010, 11:18   #3
battrack, сразу видно, что в СУБД вы новичёк...
Вообщето, если у вас есть логическая связь между двумя таблицами: а здесь она на лицо, то связь должна быть и физической.
Существует такая штука - внешние ключи. Очень удобная. Даже MySQL их поддерживает (правда не у каждого хостера).
Смысл в том, что если ты связываешь 2 таблицы, то можешь указать 1 из 2-х способов взаимодействия.
По первому способу при попытке удалить объект базовой таблицы (в твоём случае товар), автоматически удаляются все подчинённые объекты (то есть этот товар вообще исчезнет из всех заказов)
По второму способу до удаления всех дочерних объектов, удаление базового НЕВОЗМОЖНО. То есть никакой админ просто не в состоянии удалить ваш товар.

Если даже ваша СУБД и не поддерживает внешние ключи, то всегда можно сделать следующим образом...

функция удаления товара в магазине
Проверяем все заказы на наличие этого товара в заказе
Если товара нет - смело DELETE FROM...
Если товар есть, ставим у него флаг удалённости!!! - то есть товары с этим флагом в списке товаров более не будут выводиться. Но реально он есть!
Данный способ немного геммороен, из за того, что потенциально возможно скапливание мусора (заказы уже обработанны и удалены из бд, и бесхозные товары (которые ещё и никуда не выводятся) вообще висят в воздухе.
Данную ситуацию можно решить через CRON (один SQL запрос вполне может удалить все бесхозные товары) ну или высчитывать в процедуре удаления заказа.

Ещё как вариант - делать примерно как вы (записывать имя, но не забывать о!)
Кроме названия вам нужна ещё и цена. И связывать обязательно нужно через id)
Если товар удалён, то хотябы можно вытащить имя/цену. А если не удалён - то дать на него полноценную ссылку и кучу других украшательств.
 
Старый 22.04.2010, 11:18
Закрытая тема


Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен искатель дизайн-заказов MuMMia Вакансии 2 22.04.2011 09:50
настройка доставки в интернет магазине на Hostcms vitaly-go HTML, CSS, JavaScript 0 01.12.2010 14:11
хранение файлов в mysql Леха ASP, Perl, PHP и MySQL 7 09.08.2006 16:06
Php-программист бесплатно/дёшево выполнит пару заказов (нужно для портфолио) Qsman Резюме 3 22.02.2006 16:36
Как такое организовать? kors@r HTML, CSS, JavaScript 6 11.01.2006 10:37


Текущее время: 15:37. Часовой пояс GMT +4.

Реклама на форуме Условия размещения рекламы
Биржа ссылок Заработай на сайте!
Тарифный план «Lite»
Место: 1000 Мб
Трафик: неограниченный
Панель управления
Заказать ТП «Lite»
Тарифный план «Normal»
Место: 2000 Мб
Трафик: неограниченный
Поддержка скриптов
Заказать ТП «Normal»
Тарифный план «Profy»
Место: 7000 Мб
Трафик: неограниченный
Поддержка скриптов
Заказать ТП «Profy»
Тарифный план «Места хватит!»
Место: 25 ГБ
Трафик: неограниченный
Поддержка SSI, ssh
Заказать ТП «Места хватит!»
Дизайнерский форум