powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Интернет магазин -
25 сообщений из 37, страница 1 из 2
Интернет магазин -
    #36846658
Neox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день! Нужно спроектировать интернет магазин комплектующих до компьютера.
Приход и расход я описываю двумя таблицами
(arrival, arrival_items) u (order,order_items)
Вопрос:
Как подсчитать остаток товара ?
ddd[/img]
...
Рейтинг: 0 / 0
Интернет магазин -
    #36846687
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Neox,

Вариант 1: Если интересует получение остатка по товару, а не остатков по всем, то просто запрашиваем сумму приходов товара, сумму расходов товара и в клиенте отнимаем.

Вариант2: Получение всех остатков.

а) обычно (особенно в случае большого ассортимента товаров) заводится таблица остатков. В транзакции прихода увеличиваем остаток в таблице. В транзакции расхода проверяем наличие нужного кол-ва товара в остатках и если достаточно - проводит расход и уменьшаем остаток. Аналогично и при отмене ранее введенных приходов и расходов.

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

Предпочтительнее вариант а) конечно. Главное корректность данных не нарушать.
...
Рейтинг: 0 / 0
Интернет магазин -
    #36846691
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, как будете гарантировать непересекаемость id-шек видеокарт, процессоров и прочих железек? Нужна табличка с общим счетчиком из которого при заведении нового товара будет браться значение id для него.
...
Рейтинг: 0 / 0
Интернет магазин -
    #36846700
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И запросы типа "Вывести все приходы/остатки процессоров" придется писать через джоин с таблицей процессоров или через подзапрос из нее. Не оптимально.

А еще хуже если попросить вывести все приходы не одно типа комплектующих, а двух или трех из имеющихся 20-ти.

Может лучше завести таблицу "Товары" [product_id, product_type, product_properties_id] и по product_properties_id связывать строку из соответсвующей таблицы процессоров/видух/винтов и т.д.? При этом product_id никто не мешает дублировать и в этих таблицах, т.е. оставить их в том виде как и сейчас.
...
Рейтинг: 0 / 0
Интернет магазин -
    #36847037
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Neox,

Если задача настоящая, а не учебная, то неправильно под каждый вид комплектующих создавать отдельную таблицу. Завезут, например, TV-тюнеры - будете БД перестраивать?
Да и столь жестко зашивать набор характеристик - тоже плохо. Введут еще одну технологию в процессорах - будете колонку добавлять и формы/отчеты/фильтры переделывать?
...
Рейтинг: 0 / 0
Интернет магазин -
    #36870608
Neox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftNeox,

Если задача настоящая, а не учебная, то неправильно под каждый вид комплектующих создавать отдельную таблицу. Завезут, например, TV-тюнеры - будете БД перестраивать?
Да и столь жестко зашивать набор характеристик - тоже плохо. Введут еще одну технологию в процессорах - будете колонку добавлять и формы/отчеты/фильтры переделывать?
а как тогда правильно?
Характеристики ведь у коплектующих разнятся сильно.
...
Рейтинг: 0 / 0
Интернет магазин -
    #36870622
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Neoxа как тогда правильно?
Характеристики ведь у коплектующих разнятся сильно.Сходите в поиск по этому сайту по словам "характеристики" и EAV.
Я не говорю, что это наиболее правильный вариант, но в данном случае я бы построил БД именно так.
...
Рейтинг: 0 / 0
Интернет магазин -
    #36871171
Flying Dutchman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NeoxmiksoftNeox,

Если задача настоящая, а не учебная, то неправильно под каждый вид комплектующих создавать отдельную таблицу. Завезут, например, TV-тюнеры - будете БД перестраивать?
Да и столь жестко зашивать набор характеристик - тоже плохо. Введут еще одну технологию в процессорах - будете колонку добавлять и формы/отчеты/фильтры переделывать?
а как тогда правильно?
Характеристики ведь у коплектующих разнятся сильно.

Я в прошлом году занимался разработкой БД для Интернет-магазина и использовал EAV для хранения товаров и их свойств. В очень упрощенном виде я описал это здесь .
...
Рейтинг: 0 / 0
Интернет магазин -
    #36871185
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flying Dutchman,
по тынцуКроме этого, можно легко искать товары, то есть выполнять запросы типа "Найти все товары где Цвет=Красный и Размер=XL". Для этого используется простой запрос с использованием реляционного деления. можете продемострировать этот простой запрос? есть некоторые сомнения в его "простоте"
...
Рейтинг: 0 / 0
Интернет магазин -
    #36871270
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Neoxа как тогда правильно?
Характеристики ведь у коплектующих разнятся сильно.

Тут куда не кинь, везде клин. :)

Разделите БД на слабосвязанные подсистемы.
Модуль "продажи" оперирует небольшим числом наименований докумнетов, в которых фигурируют не VGA или CPU, а артикулы товаров с названиями. Для бухгалтерии этого достаточно.

Модуль "витрина" напротив оперирует детальными характеристиками товаров.

Модуль "склад" оперирует упаковками, весами, габаритами и т.п. довольно стабильными понятиями.

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

Все типы товаров со своими специфическими характеристиками являются подтипом "товара". Впринципе нет ничего криминального в том чтобы просто добавить колонки к отношению "товар". Объектная СУБД скорее всего так и сделает. Но возможно более удобным в плане конфигурирования будет использование слаботипизированных структур данных, типа XML с последующим построением инвертированного индекса, если таковые поддерживаютмя в СУБД - например Text в ORACLE. В отличии от EAV сущности продолжают храниться в реляционном виде - а вся рутина, связанная с декомпозицией сущности на тройки EAV берёт на себя СУБД и скрывает эту кухню за презентационным слоем операторов контекстного поиска и т.п.

Продажи, скад и витрина соединяются лишь на уровне артикула и названия товара. Артикулы следует разместить в системном модуле "классификаторы", который сведёт коды из разных прикладных модулей воедино и при этом изолирует прикладные модули друго от друга.
...
Рейтинг: 0 / 0
Интернет магазин -
    #36871314
Neox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftNeox,

Я в прошлом году занимался разработкой БД для Интернет-магазина и использовал EAV для хранения товаров и их свойств. В очень упрощенном виде я описал это здесь .
Таблица Product_Attribute не обязательная, правда?
...
Рейтинг: 0 / 0
Интернет магазин -
    #36871316
Neox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой сорри. Всё правильно. Эта таблица нужна, ведь несколько товаров, даже разных по смыслу могут иметь один атрибут(свойство).
...
Рейтинг: 0 / 0
Интернет магазин -
    #36873680
nchuyko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Neox,

Привет, Neox.
Как мне показалось не совсем правильный подход в проектированию таблиц, а именно:
- вынесение в отдельные таблицы товаров (таблица товаров должна быть одна)
- таблица приходов и расходов должна быть одна (просто меняется знак операции).
Вообще принцип построения всех интернет магазинов одинаков, сложности начинаются, когда дело доходит до складских документов, остатков, заказов (поставщику) и пр. Вот, например одна из наших работ интернет-магазин цветов и семян
Здесь разделены так называемые фронт офис и бак-офис, т.е. то что вы проектируете - бак офис, оно скрыто от покупателя. Такие элементы мы проектируем при помощи своей SaaS EraTech Online .
Структура таблиц, связи, отчеты, формы проектируются при помощи визардов, так же возможно вставлять HTML код для более изысканной обработки данных. Все это крутится на SQL сервере. Если есть желание попробовать саму систему, то заполнив форму получите бесплатный доступ так же поможем вам сделать первые шаги.
...
Рейтинг: 0 / 0
Интернет магазин -
    #36875501
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nchuyko
- вынесение в отдельные таблицы товаров (таблица товаров должна быть одна)


Для склада - да. Для витрины - не факт. Когда номенклатура стабильна, а нагрузка высока применение структурированных данных станет предпочтительнее с т.з. производительности.

nchuyko
- таблица приходов и расходов должна быть одна (просто меняется знак операции).


Не факт. Приход и расход покрываются разными документами и возможна ситуация, когда ошибочно заведённый приход исправляется заведением записи с отрицательным количеством товара.
Если повесить семантику прихода/расхода на знак числа, мы не отличим корректировки от обычных операций. Вообще, не следует один атрибут нагружать множеством смыслов.
...
Рейтинг: 0 / 0
Интернет магазин -
    #36875879
Flying Dutchman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychFlying Dutchman,
по тынцуКроме этого, можно легко искать товары, то есть выполнять запросы типа "Найти все товары где Цвет=Красный и Размер=XL". Для этого используется простой запрос с использованием реляционного деления. можете продемострировать этот простой запрос? есть некоторые сомнения в его "простоте"

Приношу извинения за задержку с ответом.

Для SQL Server 2008 запрос для указанной структуры таблиц выглядит так:

Код: plaintext
1.
2.
3.
4.
5.
6.
  select prod_attr.Product_Id
    from Product_Attribute_Value prod_attr inner join @Product_Filter filter
      on prod_Attr.Attribute_Id = filter.Attribute_Id
      and prod_Attr.Value = filter.Attribute_Value
    group by prod_attr.Product_Id
    having count(prod_Attr.Product_Id) = (select count(*) from @Product_Filter);

Здесь @Product_Filter определяется как

Код: plaintext
1.
  declare @Product_Filter dbo.Product_Filter

а тип dbo.Product_Filter в свою очередь определяется как

Код: plaintext
1.
2.
3.
CREATE TYPE dbo.Product_Filter AS TABLE
  (Attribute_Id bigint primary key,
   Attribute_value sql_variant)

Перед выполнением запроса в переменную @Product_Filter заносятся значения атрибутов для поиска, например так:

Код: plaintext
1.
2.
insert into @Product_Filter values( 1 ,  44 ) -- размер
insert into @Product_Filter values( 2 , 'Black') -- цвет

Вот и все.
...
Рейтинг: 0 / 0
Интернет магазин -
    #36875911
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flying Dutchman...
Вот и все.ясно, спасибо ))
имхо, это, конечно, значительно проще, чем
Код: plaintext
SELECT id FROM dbo.Products WHERE Color = 'Красный' AND Size = 'XL'
;-)) уж простите мне мою иронию ))
...
Рейтинг: 0 / 0
Интернет магазин -
    #36876801
Flying Dutchman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychFlying Dutchman...
Вот и все.ясно, спасибо ))
имхо, это, конечно, значительно проще, чем
Код: plaintext
SELECT id FROM dbo.Products WHERE Color = 'Красный' AND Size = 'XL'
;-)) уж простите мне мою иронию ))

Этот SELECT и мой SELECT применяется к разной структуре базы данных.
...
Рейтинг: 0 / 0
Интернет магазин -
    #36876818
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flying DutchmanЭтот SELECT и мой SELECT применяется к разной структуре базы данных.да я знаю, я не с целью завести очередной холивар. Простите ещё раз. ))
...
Рейтинг: 0 / 0
Интернет магазин -
    #36887642
Neox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник


Вот моя структура.
...
Рейтинг: 0 / 0
Интернет магазин -
    #36887657
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NeoxВот моя структура.А invoice в данном контексте - это что?
...
Рейтинг: 0 / 0
Интернет магазин -
    #36887661
Neox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,
Приход товара
...
Рейтинг: 0 / 0
Интернет магазин -
    #36887668
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NeoxПриход товараа зачем он в интернет-магазине?
...
Рейтинг: 0 / 0
Интернет магазин -
    #36887675
Neox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как тогда сберегать количество товара? Если не через разницу прихода-расхода?
...
Рейтинг: 0 / 0
Интернет магазин -
    #36887708
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NeoxКак тогда сберегать количество товара? Если не через разницу прихода-расхода?А это автономная база? У нее нет "опорной" корпоративной базы?
...
Рейтинг: 0 / 0
Интернет магазин -
    #36887720
Neox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Интернет магазин -
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]