|
|
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Добрый день! Нужно спроектировать интернет магазин комплектующих до компьютера. Приход и расход я описываю двумя таблицами (arrival, arrival_items) u (order,order_items) Вопрос: Как подсчитать остаток товара ? ddd[/img] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2010, 00:51 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Neox, Вариант 1: Если интересует получение остатка по товару, а не остатков по всем, то просто запрашиваем сумму приходов товара, сумму расходов товара и в клиенте отнимаем. Вариант2: Получение всех остатков. а) обычно (особенно в случае большого ассортимента товаров) заводится таблица остатков. В транзакции прихода увеличиваем остаток в таблице. В транзакции расхода проверяем наличие нужного кол-ва товара в остатках и если достаточно - проводит расход и уменьшаем остаток. Аналогично и при отмене ранее введенных приходов и расходов. б) без таблицы остатков запрашиваем суммы количеств артикулов из приходов с LEFT JOIN по расходам (ничего из них не выбирая) дабы получить весь список артикулов, т.е. включить и случаи когда прихода нет (забыли оформить), а расход есть (прога позволяет). Если прога не позволяет такой ситуации, тогда джоинить нет смысла - в приходах всегда полный список артикулов. Сортируем по артикулу. Так же запрашиваем суммы количеств артикулов из расходов, тут уже обязательно лефт-джоиним с таблицей приходов, чтобы получить в точности такой же набор артикулов как и в предыдущем селекте, сортируем по артикулу. Получим два набора, в которых одинаковое количество строк, в N-ой строке первого набора сколько всего пришло такого-то товара, а в N-ой строке второго - сколько ушло этого же товара. Выводим артикул, пришло (из первого набора), ушло (из второго), пришло - ушло. Предпочтительнее вариант а) конечно. Главное корректность данных не нарушать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2010, 02:06 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Кстати, как будете гарантировать непересекаемость id-шек видеокарт, процессоров и прочих железек? Нужна табличка с общим счетчиком из которого при заведении нового товара будет браться значение id для него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2010, 02:10 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
И запросы типа "Вывести все приходы/остатки процессоров" придется писать через джоин с таблицей процессоров или через подзапрос из нее. Не оптимально. А еще хуже если попросить вывести все приходы не одно типа комплектующих, а двух или трех из имеющихся 20-ти. Может лучше завести таблицу "Товары" [product_id, product_type, product_properties_id] и по product_properties_id связывать строку из соответсвующей таблицы процессоров/видух/винтов и т.д.? При этом product_id никто не мешает дублировать и в этих таблицах, т.е. оставить их в том виде как и сейчас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2010, 02:19 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Neox, Если задача настоящая, а не учебная, то неправильно под каждый вид комплектующих создавать отдельную таблицу. Завезут, например, TV-тюнеры - будете БД перестраивать? Да и столь жестко зашивать набор характеристик - тоже плохо. Введут еще одну технологию в процессорах - будете колонку добавлять и формы/отчеты/фильтры переделывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2010, 10:53 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
miksoftNeox, Если задача настоящая, а не учебная, то неправильно под каждый вид комплектующих создавать отдельную таблицу. Завезут, например, TV-тюнеры - будете БД перестраивать? Да и столь жестко зашивать набор характеристик - тоже плохо. Введут еще одну технологию в процессорах - будете колонку добавлять и формы/отчеты/фильтры переделывать? а как тогда правильно? Характеристики ведь у коплектующих разнятся сильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2010, 17:26 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Neoxа как тогда правильно? Характеристики ведь у коплектующих разнятся сильно.Сходите в поиск по этому сайту по словам "характеристики" и EAV. Я не говорю, что это наиболее правильный вариант, но в данном случае я бы построил БД именно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2010, 17:35 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
NeoxmiksoftNeox, Если задача настоящая, а не учебная, то неправильно под каждый вид комплектующих создавать отдельную таблицу. Завезут, например, TV-тюнеры - будете БД перестраивать? Да и столь жестко зашивать набор характеристик - тоже плохо. Введут еще одну технологию в процессорах - будете колонку добавлять и формы/отчеты/фильтры переделывать? а как тогда правильно? Характеристики ведь у коплектующих разнятся сильно. Я в прошлом году занимался разработкой БД для Интернет-магазина и использовал EAV для хранения товаров и их свойств. В очень упрощенном виде я описал это здесь . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2010, 22:33 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Flying Dutchman, по тынцуКроме этого, можно легко искать товары, то есть выполнять запросы типа "Найти все товары где Цвет=Красный и Размер=XL". Для этого используется простой запрос с использованием реляционного деления. можете продемострировать этот простой запрос? есть некоторые сомнения в его "простоте" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2010, 22:42 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Neoxа как тогда правильно? Характеристики ведь у коплектующих разнятся сильно. Тут куда не кинь, везде клин. :) Разделите БД на слабосвязанные подсистемы. Модуль "продажи" оперирует небольшим числом наименований докумнетов, в которых фигурируют не VGA или CPU, а артикулы товаров с названиями. Для бухгалтерии этого достаточно. Модуль "витрина" напротив оперирует детальными характеристиками товаров. Модуль "склад" оперирует упаковками, весами, габаритами и т.п. довольно стабильными понятиями. Так вернёмся к "витрине". В решину классификации поставим абстракный тип "товар", который характеризуется артикулом, названием и неструктурированным описанием его свойств. Сюда же можно добавить области применения, данные о производителе, гарантийные обязательства, срок хранения, реализации и ещё какие то стабильные характеристики общие для любых товаров. Все типы товаров со своими специфическими характеристиками являются подтипом "товара". Впринципе нет ничего криминального в том чтобы просто добавить колонки к отношению "товар". Объектная СУБД скорее всего так и сделает. Но возможно более удобным в плане конфигурирования будет использование слаботипизированных структур данных, типа XML с последующим построением инвертированного индекса, если таковые поддерживаютмя в СУБД - например Text в ORACLE. В отличии от EAV сущности продолжают храниться в реляционном виде - а вся рутина, связанная с декомпозицией сущности на тройки EAV берёт на себя СУБД и скрывает эту кухню за презентационным слоем операторов контекстного поиска и т.п. Продажи, скад и витрина соединяются лишь на уровне артикула и названия товара. Артикулы следует разместить в системном модуле "классификаторы", который сведёт коды из разных прикладных модулей воедино и при этом изолирует прикладные модули друго от друга. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2010, 23:58 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
miksoftNeox, Я в прошлом году занимался разработкой БД для Интернет-магазина и использовал EAV для хранения товаров и их свойств. В очень упрощенном виде я описал это здесь . Таблица Product_Attribute не обязательная, правда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2010, 00:42 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
ой сорри. Всё правильно. Эта таблица нужна, ведь несколько товаров, даже разных по смыслу могут иметь один атрибут(свойство). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2010, 00:46 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Neox, Привет, Neox. Как мне показалось не совсем правильный подход в проектированию таблиц, а именно: - вынесение в отдельные таблицы товаров (таблица товаров должна быть одна) - таблица приходов и расходов должна быть одна (просто меняется знак операции). Вообще принцип построения всех интернет магазинов одинаков, сложности начинаются, когда дело доходит до складских документов, остатков, заказов (поставщику) и пр. Вот, например одна из наших работ интернет-магазин цветов и семян Здесь разделены так называемые фронт офис и бак-офис, т.е. то что вы проектируете - бак офис, оно скрыто от покупателя. Такие элементы мы проектируем при помощи своей SaaS EraTech Online . Структура таблиц, связи, отчеты, формы проектируются при помощи визардов, так же возможно вставлять HTML код для более изысканной обработки данных. Все это крутится на SQL сервере. Если есть желание попробовать саму систему, то заполнив форму получите бесплатный доступ так же поможем вам сделать первые шаги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2010, 10:04 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
nchuyko - вынесение в отдельные таблицы товаров (таблица товаров должна быть одна) Для склада - да. Для витрины - не факт. Когда номенклатура стабильна, а нагрузка высока применение структурированных данных станет предпочтительнее с т.з. производительности. nchuyko - таблица приходов и расходов должна быть одна (просто меняется знак операции). Не факт. Приход и расход покрываются разными документами и возможна ситуация, когда ошибочно заведённый приход исправляется заведением записи с отрицательным количеством товара. Если повесить семантику прихода/расхода на знак числа, мы не отличим корректировки от обычных операций. Вообще, не следует один атрибут нагружать множеством смыслов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2010, 19:05 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
egorychFlying Dutchman, по тынцуКроме этого, можно легко искать товары, то есть выполнять запросы типа "Найти все товары где Цвет=Красный и Размер=XL". Для этого используется простой запрос с использованием реляционного деления. можете продемострировать этот простой запрос? есть некоторые сомнения в его "простоте" Приношу извинения за задержку с ответом. Для SQL Server 2008 запрос для указанной структуры таблиц выглядит так: Код: plaintext 1. 2. 3. 4. 5. 6. Здесь @Product_Filter определяется как Код: plaintext 1. а тип dbo.Product_Filter в свою очередь определяется как Код: plaintext 1. 2. 3. Перед выполнением запроса в переменную @Product_Filter заносятся значения атрибутов для поиска, например так: Код: plaintext 1. 2. Вот и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2010, 00:31 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Flying Dutchman... Вот и все.ясно, спасибо )) имхо, это, конечно, значительно проще, чем Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2010, 01:31 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
egorychFlying Dutchman... Вот и все.ясно, спасибо )) имхо, это, конечно, значительно проще, чем Код: plaintext Этот SELECT и мой SELECT применяется к разной структуре базы данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2010, 13:12 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Flying DutchmanЭтот SELECT и мой SELECT применяется к разной структуре базы данных.да я знаю, я не с целью завести очередной холивар. Простите ещё раз. )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2010, 13:16 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
NeoxВот моя структура.А invoice в данном контексте - это что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2010, 16:58 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
miksoft, Приход товара ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2010, 17:00 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
NeoxПриход товараа зачем он в интернет-магазине? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2010, 17:02 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Как тогда сберегать количество товара? Если не через разницу прихода-расхода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2010, 17:06 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36887708&tid=1542477]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
156ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 448ms |

| 0 / 0 |
