|
|
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
NeoxКак тогда сберегать количество товара? Если не через разницу прихода-расхода?А это автономная база? У нее нет "опорной" корпоративной базы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2010, 17:16 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
а зачем нужна таблица tt_movement? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2010, 17:27 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Показывает с какого прихода списывается товар(расходом) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2010, 17:36 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
NeoxПоказывает с какого прихода списывается товар(расходом)а почему тогда она устанавливает связь между "головами" документов, а не между отдельными позициями? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2010, 17:39 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Блин точно. Это ведь неправильно. Нужно будет передумать структуру учёта товара. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2010, 17:48 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Уважаемые, а объясните новичку вот этот момент в дискуссии: - {нежелательно делать} вынесение в отдельные таблицы товаров (таблица товаров должна быть одна) - Для склада - да. Для витрины - не факт. Когда номенклатура стабильна, а нагрузка высока применение структурированных данных станет предпочтительнее с т.з. производительности. Имеется ввиду что если товаров слишком много, то общая таблица будет слишком большой и медленной? Не совсем понятно, как вообще можно сделать общую таблицу по товарам, если у них разное количество параметров. Например товар "утюг" имеет параметры "вес" и "производитель", а товар "холодильник" - еще и "цвет", "число отсеков", "наличие морозилки". Как их объединить в одной таблице? Я вижу варианты: 1) сделать таблицу со всеми возможными колонками - то есть и морозилка, и вес утюга, и в той строке где параметр не нужен - ставить null. 2) сделать таблицу с общими для всех товаров параметрами (цена, название), а то что специфично (наличие морозилки) - хранить в отдельных таблицах для каждого типа товара, а потом делать join. Какой способ лучше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2010, 11:14 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
DymytryУважаемые, а объясните новичку вот этот момент в дискуссии: - {нежелательно делать} вынесение в отдельные таблицы товаров (таблица товаров должна быть одна) - Для склада - да. Для витрины - не факт. Когда номенклатура стабильна, а нагрузка высока применение структурированных данных станет предпочтительнее с т.з. производительности.Имеется ввиду что если товаров слишком много, то общая таблица будет слишком большой и медленной?Не будет. Деление товара на разные таблицы по видам, имхо, имеет смысл в настолько узком случае (очень высокая нагрузка, немного видов товаров, редкие появления новых видов товаров, крайне редкие изменения перечня характеристик товаров), что не стоит на него заморачиваться. DymytryНе совсем понятно, как вообще можно сделать общую таблицу по товарам, если у них разное количество параметров. Например товар "утюг" имеет параметры "вес" и "производитель", а товар "холодильник" - еще и "цвет", "число отсеков", "наличие морозилки". Как их объединить в одной таблице? Я вижу варианты: 1) сделать таблицу со всеми возможными колонками - то есть и морозилка, и вес утюга, и в той строке где параметр не нужен - ставить null. 2) сделать таблицу с общими для всех товаров параметрами (цена, название), а то что специфично (наличие морозилки) - хранить в отдельных таблицах для каждого типа товара, а потом делать join. Какой способ лучше?Вроде бы уже неоднократно, в т.ч. и в данном топике, обсудили, что 2-ой вариант правильнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2010, 12:01 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
miksoft, спасибо за совет. Во втором варианте мне не очень нравится такой побочный эффект: Допустим я пишу URL запрос для выбора товаров вида &type=phone&country=korea&company=samsung чтобы посмотреть все телефоны самсунг из кореи. Так вот в программе (в моем случае это java) мне придется разбирать какие поля к каким таблицам относятся. Ведь часть полей относится к общей таблице, и часть к таблицам по типам товаров. И чтобы транформировать URL запрос в SQL запрос мне надо это знать. В итоге мне придется как-то жестко вбивать названия полей в свой код, или каждый раз считывать их из базы. Что не очень как-то. Или это можно обойти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2010, 16:25 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Dymytrymiksoft, спасибо за совет. Во втором варианте мне не очень нравится такой побочный эффект: Допустим я пишу URL запрос для выбора товаров вида &type=phone&country=korea&company=samsung чтобы посмотреть все телефоны самсунг из кореи. Так вот в программе (в моем случае это java) мне придется разбирать какие поля к каким таблицам относятся. Ведь часть полей относится к общей таблице, и часть к таблицам по типам товаров. И чтобы транформировать URL запрос в SQL запрос мне надо это знать. В итоге мне придется как-то жестко вбивать названия полей в свой код, или каждый раз считывать их из базы. Что не очень как-то. Или это можно обойти?Во-первых, если у вас есть таблица с фиксированными полями, то нет ничего страшного в том, чтобы жестко вбивать имена полей из нее в код. Ведь для остальных таблиц Вы все равно это делаете? Тем более, что это можно автоматизировать, например, генерацией некоего фрагмента кода на этапе создания/модификации этой таблицы. Во-вторых, конкретно у товара можно вообще все характеристики хранить в EAV-е и тогда не нужно будет делать выбор какое поле из какой таблицы. Кстати, тут:miksoftDymytry2) сделать таблицу с общими для всех товаров параметрами (цена, название), а то что специфично (наличие морозилки) - хранить в отдельных таблицах для каждого типа товара, а потом делать join. Какой способ лучше?Вроде бы уже неоднократно, в т.ч. и в данном топике, обсудили, что 2-ой вариант правильнее.я ответил неправильно, т.к. неправильно прочитал Ваш пост. Правильным вариантом я считаю хранение атрибутов товара в EAV-е - так, как сделал топикстартер в последнем его варианте (или похоже). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2010, 16:39 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Спасибо! А правильно ли я понял, что в таком случае в моей таблице аттрибутов мне придется все их значения хранить в одной колонке, то есть все данные будут одного типа (скорее всего VARCHAR)? Нет ли в этом плохого? Ведь если я занесу туда например цену, то я не смогу сортировать и фильтровать данные по ее текстовому значению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2010, 17:46 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
DymytryСпасибо! А правильно ли я понял, что в таком случае в моей таблице аттрибутов мне придется все их значения хранить в одной колонке, то есть все данные будут одного типа (скорее всего VARCHAR)? Нет ли в этом плохого? Ведь если я занесу туда например цену, то я не смогу сортировать и фильтровать данные по ее текстовому значению.Тут возможны варианты. Во-первых, значения атрибутов можно нормализовать, т.е. в основной табличке оставить только их id, а их самих хранить в отдельной таблице(-ах), где уже больше пространства для маневра. В т.ч. сортировку можно задавать дополнительным числовым полем. Во-вторых, конкретно цена не очень подходит для хранения в таблице с остальным атрибутами. Если цена у товара всегда ровно одна, то ее лучше хранить в справочнике товара. Если цен может быть много (разные валюты, скидки, опт, закупочная/продажная, исторические данные), то лучше хранить их в отдельной EAV-подобной таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2010, 17:57 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
Но в итоге получается что наличие дополнительной таблицы для данного типа товара неизбежно. Там может быть цена, геометрические размеры, вес и другие цифровые параметры по которым возможен поиск и сортировка. Возникает вопрос: а если доп. таблица неизбежна, то зачем EAV? Только если избежать числового поиска через ввод числовых категорий, типа "большая цена/средняя цена/малая цена" как аттрибут товара, и тогда можно не делать доп. таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2010, 18:37 |
|
||
|
Интернет магазин -
|
|||
|---|---|---|---|
|
#18+
DymytryНо в итоге получается что наличие дополнительной таблицы для данного типа товара неизбежно. Там может быть цена, геометрические размеры, вес и другие цифровые параметры по которым возможен поиск и сортировка. Возникает вопрос: а если доп. таблица неизбежна, то зачем EAV?Эта таблица одна для всех типов товаров, а не для данного типа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2010, 18:43 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1542477]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
183ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
73ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 544ms |

| 0 / 0 |
