powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Схема для системы управления товарами
10 сообщений из 10, страница 1 из 1
Схема для системы управления товарами
    #37663576
VeroLom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поругайте схему :) Нужно для системы управления складом т.е. добавление привезённого товара, редактирование свойств, "выставление" в интернет-магазины, учет клиентов и продаж. Интересует в основном аспект нормализации и бардак со связями (типами, изначально писал на SQL, потом сделал импорт в Workbench'е).

Схема:


SQL:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `wh` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `wh` ;

-- -----------------------------------------------------
-- Table `wh`.`tbl_desc_templates`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `wh`.`tbl_desc_templates`;
CREATE TABLE IF NOT EXISTS `wh`.`tbl_desc_templates` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `content` TEXT NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;

 
-- -----------------------------------------------------
-- Table `wh`.`tbl_types`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `wh`.`tbl_types`;
CREATE  TABLE IF NOT EXISTS `wh`.`tbl_types` (
    `id` INT NOT NULL AUTO_INCREMENT ,
    `name` VARCHAR(60) NOT NULL ,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `wh`.`tbl_categories`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `wh`.`tbl_categories`;
CREATE  TABLE IF NOT EXISTS `wh`.`tbl_categories` (
    `id` INT NOT NULL AUTO_INCREMENT ,
    `name` VARCHAR(100) NOT NULL ,
    `parent_id` INT NULL ,
    `ex_category_id` INT NOT NULL,
    PRIMARY KEY (`id`) ,
    CONSTRAINT `fk_parent_category`
        FOREIGN KEY (`parent_id`)
        REFERENCES `wh`.`tbl_categories` (`id` )
        ON DELETE CASCADE
        ON UPDATE RESTRICT
) ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `wh`.`tbl_goods`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `wh`.`tbl_goods`;
CREATE  TABLE IF NOT EXISTS `wh`.`tbl_goods` (
    `id` INT NOT NULL AUTO_INCREMENT ,
    `part` VARCHAR(45) NOT NULL ,
    `type_id` INT NOT NULL ,
    `category_id` INT NOT NULL ,
    `place` VARCHAR(45) NOT NULL ,
    `title` VARCHAR(200) NOT NULL ,
    `title_template` VARCHAR(200) NOT NULL ,
    `color` VARCHAR(45) NOT NULL ,
    `size` INT NOT NULL ,
    `desc` TEXT NOT NULL ,
    `desc_template_id` INT NULL ,
    `price` FLOAT NOT NULL ,
    `count` INT NOT NULL ,
    `creator_id` INT NOT NULL ,
    `create_time` DATETIME NOT NULL,
    `editor_id` INT NOT NULL ,
    `edit_time` DATETIME NOT NULL,
    PRIMARY KEY (`id`, `type_id`, `category_id`) ,
    CONSTRAINT `fk_goods_type`
        FOREIGN KEY (`type_id` )
        REFERENCES `wh`.`tbl_types` (`id` )
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    CONSTRAINT `fk_goods_category`
        FOREIGN KEY (`category_id` )
        REFERENCES `wh`.`tbl_categories` (`id` )
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    CONSTRAINT `fk_goods_desc_template`
        FOREIGN KEY (`desc_template_id`)
        REFERENCES `wh`.`tbl_desc_templates` (`id`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    CONSTRAINT `fk_goods_creator`
        FOREIGN KEY (`creator_id`)
        REFERENCES `wh`.`tbl_users` (`id`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    CONSTRAINT `fk_goods_editor`
        FOREIGN KEY (`editor_id`)
        REFERENCES `wh`.`tbl_users` (`id`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT
) ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `wh`.`users`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `wh`.`tbl_incomings`;
CREATE TABLE IF NOT EXISTS `wh`.`tbl_incomings` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `goods_id` INT NOT NULL,
    `creator_id` INT NOT NULL,
    `count` INT NOT NULL,
    `incomings_date` DATETIME NOT NULL,
    PRIMARY KEY (`id`),
    CONSTRAINT `fk_incoming_goods`
        FOREIGN KEY (`goods_id`)
        REFERENCES `wh`.`tbl_goods` (`id`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    CONSTRAINT `fk_incomings_creator`
        FOREIGN KEY (`creator_id`)
        REFERENCES `wh`.`tbl_users` (`id`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT
) ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `wh`.`users`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `wh`.`tbl_users`;
CREATE  TABLE IF NOT EXISTS `wh`.`tbl_users` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `login` VARCHAR(45) NOT NULL,
    `password` VARCHAR(45) NOT NULL,
    `last_access` VARCHAR(45) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `wh`.`clients`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `wh`.`tbl_clients`;
CREATE  TABLE IF NOT EXISTS `wh`.`tbl_clients` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `login` VARCHAR(60) NOT NULL,
    `uid` INT NOT NULL,
    `email` VARCHAR(100) NOT NULL,
    `fio` VARCHAR(120) NOT NULL,
    `company` VARCHAR(100),
    `phone` VARCHAR(60),
    `address` VARCHAR(120) NOT NULL,
    `city` VARCHAR(60) NOT NULL,
    `post_code` VARCHAR(30) NOT NULL,
    `country` VARCHAR(60),
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `wh`.`tbl_delivery_types`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `wh`.`tbl_delivery_types`;
CREATE TABLE IF NOT EXISTS `wh`.`tbl_delivery_types` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `title` VARCHAR(120) NOT NULL,
    `cost` FLOAT NOT NULL,
    PRIMARY KEY(`id`)
) ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `wh`.`tbl_shops`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `wh`.`tbl_shops`;
CREATE TABLE IF NOT EXISTS `wh`.`tbl_shops` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(60),
    `last_update` DATETIME NOT NULL,
    PRIMARY KEY(`id`)
) ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `wh`.`tbl_sale_goods`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `wh`.`tbl_sale_goods`;
CREATE TABLE IF NOT EXISTS `wh`.`tbl_sale_goods` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `goods_id` INT NOT NULL,
    `shop_id` INT NOT NULL,
    `price` INT NOT NULL,
    `count` INT NOT NULL,
    `status` INT NOT NULL,
    PRIMARY KEY (`id`),
    CONSTRAINT `fk_sale_goods_goods`
        FOREIGN KEY (`goods_id`)
        REFERENCES `wh`.`tbl_goods` (`id`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    CONSTRAINT `fk_sale_goods_shop`
        FOREIGN KEY (`shop_id`)
        REFERENCES `wh`.`tbl_shops` (`id`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT
) ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `wh`.`tbl_orders`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `wh`.`tbl_orders`;
CREATE TABLE IF NOT EXISTS `wh`.`tbl_orders` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `tid` VARCHAR(60) NOT NULL,
    `date` DATETIME NOT NULL,
    `goods_id` INT NOT NULL,
    `cost` DOUBLE NOT NULL,
    `delivery_type_id` INT NOT NULL,
    `client_id` INT NOT NULL,
    `tid` VARCHAR(60) NOT NULL,
    `status` INT NOT NULL,
    PRIMARY KEY (`id`),
    CONSTRAINT `fk_orders_goods`
        FOREIGN KEY (`goods_id`)
        REFERENCES `wh`.`tbl_sale_goods`
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    CONSTRAINT `fk_orders_delivery_type`
        FOREIGN KEY (`delivery_type_id`)
        REFERENCES `wh`.`tbl_delivery_types` (`id`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    CONSTRAINT `fk_orders_client`
        FOREIGN KEY (`client_id`)
        REFERENCES `wh`.`tbl_clients` (`id`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT
) ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;


...
Рейтинг: 0 / 0
Схема для системы управления товарами
    #37663586
VeroLom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Буду использовать Yii Framework и ActiveRecords, хотелось бы со связями разобраться.
...
Рейтинг: 0 / 0
Схема для системы управления товарами
    #37663766
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чушькакаято :)

Сто раз обсасывали склад тут и в соседних форумах.
...
Рейтинг: 0 / 0
Схема для системы управления товарами
    #37663800
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПоругайте схему :)
Пилот штурману
- Штурман, прибор
- 80
- чего 80?
- а какой прибор?

для того чтобы схему ругать надо четко понимать исходную задачу.
авторИнтересует в основном аспект нормализацииНу я бы убрал длинные текстовые поля типа place, color, city, country чисто для облегчения жизни добавляющему (как наполнять эти справочники вопрос другой, но для простоты наполнять их может и добавляльщик если не нашел подходящего)
Не понятно почему цена у товара float а в продаже int (пусть безобразно но единообразно)
Нафиг выкидывайте password из базы - каждый должен заниматся своим делом.
зачем поле телефон такое длинное - больше вероятность что туда вколотят мусор, лучше разбейте на

phone char(11) (только цифры, причем форматируйте его сами 7(095)555-5555 в базе будет как 70955555555)
ext_phone int
desc phone varchar() - а вот тут примечания - когда звонить, кого спросить и т.д.

post_code я бы больше 10 не делал

что такое title_template?
...
Рейтинг: 0 / 0
Схема для системы управления товарами
    #37664095
sti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну до склада тут еще очень далеко )
Я бы отметил:

tbl_orders:
- а если клиент заказал два товара?
- почему там goods_id, а не sale_goods_id, раз уж клиент заказывает товар в конкретном магазине
- нет цены в заказе, а ведь она может измениться в магазине уже после заказа

tbl_goods:
- если это номенклатура, то тут цена и количество лишние. Если же это таблица с остатками, то там не должно быть свойств товара. А отсюда сразу следствие - не хватает еще сущностей.
- что такое place?
- поле editor. Ну если нас не волнует, что редактировать могли много раз.
- что такое типы и категории и чем они отличаются - непонятно

Что такое templates и incomings не понял.
...
Рейтинг: 0 / 0
Схема для системы управления товарами
    #37664493
Фотография bootty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким товаром торгуете? Оружие, алкоголь, наркотики? =)

tbl_goods — сами товары? или включая остатки на складе? а сколько всего складов? приход на склад (от поставщика, возврат от клиента, ...), расход со склада (возврат поставщику, списание брака, ...), излишки-недостачи по инвентаризации, пересортицы и т.п. как проходить будут по базе? какая цена в этой таблице? как отслеживаются ее изменения во времени? почему она одна? что за size? что за place?

tbl_incomings — видимо, приходы? а от кого и по какой цене? один приход — один товар?

tbl_sale_goods — товары для продажи в магазинах? зачем тут количество? какие бывают статусы?

tbl_orders — продажи товара? одна продажа — один товар? что такое эти два tid? оплачивают товар всегда одинаково, например, за нал при получении (это точно не наркотики)))? где фиксируется факт оплаты товара?

tbl_clients — у меня два телефона и три email (или ни одного), а принимать товар буду вообще не я, а бабушка, и индекса своего я не знаю... как это будет выглядеть в БД?

< тут еще могло быть еще раз в пять больше вопросов >
...
Рейтинг: 0 / 0
Схема для системы управления товарами
    #37664559
VeroLom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stiНу до склада тут еще очень далеко )
Со складом всё довольно упрощённо будет. Фактически, это замена экселевской таблицы с 10к+ строками.

stiЯ бы отметил:
tbl_orders:
- а если клиент заказал два товара?

Тут будут не товары, а лоты. Хотя, на будущее надо будет добавить таблицу типа tbl_orders_goods_rel

sti- почему там goods_id, а не sale_goods_id, раз уж клиент заказывает товар в конкретном магазине
Проглядел, спасибо.

sti- нет цены в заказе, а ведь она может измениться в магазине уже после заказа

Цена заказа будет состоять из цены товара и стоимости доставки из соотв. таблицы.

stitbl_goods:
- если это номенклатура, то тут цена и количество лишние. Если же это таблица с остатками, то там не должно быть свойств товара. А отсюда сразу следствие - не хватает еще сущностей.
Интересно, тут я не подумал. Надо будет тогда вынести цену и количество в отдельную таблицу.

sti- что такое place?

Код места на складе. Аналогично с предыдущим, вынесу в таблицу с остатками.

- поле editor. Ну если нас не волнует, что редактировать могли много раз.

Тут, скорее, не edit, а update должен быть.

sti- что такое типы и категории и чем они отличаются - непонятно

Типы - оно и есть. Обувь, сумки, что-то ещё. Категории тут скорее для интернет-магазина.

stiЧто такое templates и incomings не понял.
templates - шаблоны описания в интернет-магазине (как, например, на eBay). Не хочу их в файлах хранить, там только HTML будет.
incomings - приход товара. Это больше для статистики и отчётов.
...
Рейтинг: 0 / 0
Схема для системы управления товарами
    #37664598
VeroLom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
boottyКаким товаром торгуете? Оружие, алкоголь, наркотики? =)
Именно! На самом деле, там будет обувь и сумки. Может, что-то ещё, но выделять отдельную таблицу для свойств я не хочу и не буду.

boottytbl_goods — сами товары? или включая остатки на складе? а сколько всего складов? приход на склад (от поставщика, возврат от клиента, ...), расход со склада (возврат поставщику, списание брака, ...), излишки-недостачи по инвентаризации, пересортицы и т.п. как проходить будут по базе? какая цена в этой таблице? как отслеживаются ее изменения во времени? почему она одна? что за size? что за place?
Сами товары. Как посоветовал sti, остатки вынесу в отдельную таблицу. Склад всего один.
Для недостачи сделаю возможность списания, а излишки будут проходить, как поставки. Цена закупочная. place - место на складе (чисто для информации, выносить не вижу особого смысла. size - размер обуви. На счёт отсутствия размера, как такового, у сумок - см. выше.

boottytbl_incomings — видимо, приходы? а от кого и по какой цене? один приход — один товар?
Да. От кого - не особо важно, там один поставщик, заказчику это не нужно. На счёт цены - я ещё подумаю, какая и где нужна и нужна ли вообще.

boottytbl_sale_goods — товары для продажи в магазинах? зачем тут количество? какие бывают статусы?
Статусы - "в продаже", "оплачен", "отправлен", "продано" и т.д., пока точно не знаю. Выносить в отдельную таблицу их не вижу смысла. Количество - честно говоря, не помню, но учту замечание.

boottytbl_orders — продажи товара? одна продажа — один товар? что такое эти два tid? оплачивают товар всегда одинаково, например, за нал при получении (это точно не наркотики)))? где фиксируется факт оплаты товара?
Именно. Одна продажа - один лот (забыл об этом написать). tid - идентификатор "транзакции" из интернет-магазина. Второй - очепятка, спасибо :)
Способ оплаты - фактически, это способ доставки т.е. или предоплата, или наложенным.

boottytbl_clients — у меня два телефона и три email (или ни одного), а принимать товар буду вообще не я, а бабушка, и индекса своего я не знаю... как это будет выглядеть в БД?
В интернет-магазине индекс - обязательное поле, email тоже обязателен и только один, для телефонов и прочего - возможно, будет какое-то поле для комментария.

bootty< тут еще могло быть еще раз в пять больше вопросов >
С удовольствием их выслушаю :)
...
Рейтинг: 0 / 0
Схема для системы управления товарами
    #37664603
VeroLom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LSVчушькакаято :)
Сто раз обсасывали склад тут и в соседних форумах.
У меня тут не просто склад, а немного более другое, чем "обсасывалось" в других местах. По-этому, запостил отдельно
...
Рейтинг: 0 / 0
Схема для системы управления товарами
    #37664625
VeroLom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257авторПоругайте схему :)
Пилот штурману
- Штурман, прибор
- 80
- чего 80?
- а какой прибор?

для того чтобы схему ругать надо четко понимать исходную задачу.
авторИнтересует в основном аспект нормализации

SERG1257Ну я бы убрал длинные текстовые поля типа place, color, city, country чисто для облегчения жизни добавляющему (как наполнять эти справочники вопрос другой, но для простоты наполнять их может и добавляльщик если не нашел подходящего)
place, color - варианты их значений пока будут захардкожены т.к. их мало и меняться они в ближайшие годы вряд ли будут. Остальное берётся из внешнего источника.

SERG1257Не понятно почему цена у товара float а в продаже int (пусть безобразно но единообразно)
Проглядел, спасибо.

SERG1257Нафиг выкидывайте password из базы - каждый должен заниматся своим делом.
Почему? Где хранить пароли?

SERG1257зачем поле телефон такое длинное - больше вероятность что туда вколотят мусор, лучше разбейте на
phone char(11) (только цифры, причем форматируйте его сами 7(095)555-5555 в базе будет как 70955555555)
ext_phone int
desc phone varchar() - а вот тут примечания - когда звонить, кого спросить и т.д.

Длинное - потому что не для России. Сколько максимально может быть, я не знаю, по-этому взял с запасом :)

SERG1257post_code я бы больше 10 не делал
Справедливо.

SERG1257что такое title_template?
Шаблон дня названия лота. будет что-то типа "СУПЕР-ПУПЕР МОДНЫЕ <goods.title> (<goods.size>) <goods.part>". Возможно, потом сделаю как-то иначе.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Схема для системы управления товарами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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