Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [MS Access] БД компьютерного магазина


Автор: Treod 30.4.2008, 18:19

Хотелось бы услышать советов по поводу проектирования БД компьютерного магазина. Ниже приведена схема данных. Посоветуйте пожалуйста что добавить, либо изменить.

user posted image

Автор: kapbepucm 30.4.2008, 19:28
Цитата(Treod @  30.4.2008,  18:19 Найти цитируемый пост)
Посоветуйте пожалуйста что добавить, либо изменить.
Я бы из таблицы "Заказы" убрал бы "Код товара"; создал ещё одну таблицу "Стороки заказов"
Код
=========================
   Стороки заказов
-------------------------
  LineID
  Код заказа
  Код товара
  Количество
=========================


Добавлено через 8 минут и 4 секунды
Потому как, если, конечно, я не ошибаюсь, на данный момент получается, что в определённом заказе будет только один определённый товар. Также не определено количество товара для конкретного заказа. smile 

Автор: bopoha 30.4.2008, 19:43
Я бы из Товаров выделил бы Наименование и Характеристики в справочник. Одинаковых товаров может пройти уйма.
И вместо русских символов использовал бы латиницу. Вместо Код писал бы как и вторичные ключи - Код товара.
Никаких пробелов в именах. Вдруг будет два пробела - большая проблемма с поиском ошибки.

По поводу латиницы:
b_[имя_таблицы] (b - база, часто изменяемые данные. Для справочников будет s)
K_[имя_таблицы] - счетчик
T_[постфикс] - текст
N_[постфикс] - число
F_[постфикс] - логический

И так далее. Очень удобно. Если не известен постфик, то берется имя таблицы. В результате в запросах никогда не перепутаете, что это за поле. Абстрактных полей типа, дата тоже нужно избегать. D_ZAKAZ - будет гораздо понятней при сравнении с D_POSTAVKA.

В целях экономии места и некоторого облегчения заполнения, можно Адрес разбить на состовляющие. Справочник улиц позволит не писать наименование полностью. 

В общем рюшечек можно много еще привести. Задавайте более конкретные вопросы. Нам ведь не извесны требования к БД.

kapbepucm, зачем это?
Цитата(kapbepucm @  30.4.2008,  19:28 Найти цитируемый пост)
Я бы из таблицы "Заказы" убрал бы "Код товара"; создал ещё одну таблицу "Стороки заказов"


Автор: kapbepucm 30.4.2008, 19:44
Ещё предложение. Вместо трёх таблиц "Клиенты", "Менеджеры", "Поставщик" сделать одну.
Всё вышеупомянутое носит рекомендательный характер и не принуждает ни к каким действиям smile 

Автор: bopoha 30.4.2008, 19:46
Цитата(kapbepucm @  30.4.2008,  19:44 Найти цитируемый пост)
Ещё предложение. Вместо трёх таблиц "Клиенты", "Менеджеры", "Поставщик" сделать одну.


Аргументировали бы хоть. Поля одинаковые? Так роли очень разные. В целях оптимизации выборки, меньшего хаоса и улучшения сопровождаемости, лучше три таблицы. Т.к. с течением времени БД меняется.

Автор: kapbepucm 30.4.2008, 19:46
Цитата(bopoha @  30.4.2008,  19:43 Найти цитируемый пост)
зачем это?
В принципе я описал...
Цитата(kapbepucm @  30.4.2008,  19:28 Найти цитируемый пост)
Потому как, если, конечно, я не ошибаюсь, на данный момент получается, что в определённом заказе будет только один определённый товар. Также не определено количество товара для конкретного заказа.


Добавлено через 1 минуту и 7 секунд
Цитата(bopoha @  30.4.2008,  19:46 Найти цитируемый пост)
Так роли очень разные
Разве ж очень?

Добавлено через 6 минут и 31 секунду
Ну, по крайней мере, сам разрабатывал и до сих пор поддерживаю складскую БД, где партнёры и работники склада в одной таблице. Клиенты не жалуются smile

Добавлено через 12 минут и 8 секунд
bopoha,если вас не затруднит, приведите хотя-бы маленький примерчик, где моя структура не совершенна.

Автор: bopoha 30.4.2008, 21:09
kapbepucm, не беспокойтесь совершенных структур БД не бывает. 

В моей практике было решение (именно мое) объединить разные роли в одну таблицу. 
Не удобство возникло в следующем:
- Таблица раздулась.
- Не понятно было какая запись к чему относится. А это понадобится в этом конкретном случае.
- Упала скорость запросов связанных с этой таблицей, при увеличении числа записей. В объединенной таблице записей на много больше.
- Возникли сложности с внесением изменений в структуру БД.

Вот, наверное, это все.

Автор: Treod 30.4.2008, 21:14
Есть небольшой вопрос. Товар будет поставляться с одной стоимостью, а сбываться с надбавкой. Мне придется в таблицу товар включить поля стоимость закупки, стоимость продажи? Или можно сделать по другому?

Автор: Treod 1.5.2008, 15:00
Моя схема данных приняла такой вид:

user posted image


Но появилась небольшая проблема.
В свойствах поля стоимость продажи в данных прописываю формулу: =([Стоимость закупки])*1,3. В форме все работает нормально. Идет надбавка 30%, но в  поле стоимость продажи данные не вносятся. Почему?



Автор: kapbepucm 1.5.2008, 16:32
Treod, а у вас всем товарам при продаже будет одинаковая наценка 30%?

Добавлено через 5 минут и 34 секунды
Если да, то поле "стоимость продажи" не совсем нужно...

Автор: kapbepucm 1.5.2008, 16:49
Если нет, то можно сделать какую нибудь структуру, которая бы по умолчанию добавляла 30%, но по желанию менеджера могла-бы и меняться. Для менеджера это могло бы выглядеть как прайс-лист. Ну а вообще, если к каждому клиенту имеется индивидуальный подход, неплохо бы добавить в таблицу "Строки заказа" поле "цена", которая по умолчанию бралась бы из прайс-листа, но по желанию менеджера могла-бы меняться.

Автор: Treod 1.5.2008, 17:04

Цитата

Treod, а у вас всем товарам при продаже будет одинаковая наценка 30%?


Да, всем товарам будет наценка 30%. 

Цитата

Если да, то поле "стоимость продажи" не совсем нужно...


А как я могу обойтись без этого поля?

Автор: kapbepucm 1.5.2008, 17:43
Цитата(Treod @  1.5.2008,  17:04 Найти цитируемый пост)
А как я могу обойтись без этого поля? 
Имею ввиду то, что хранить в таблице туже самую цену, только умноженную на 1,3 необязательно. Например, нехитрый запрос бы и сам посчитал нужную цену продажи.

Автор: Treod 1.5.2008, 18:11
Цитата

Имею ввиду то, что хранить в таблице туже самую цену, только умноженную на 1,3 необязательно. Например, нехитрый запрос бы и сам посчитал нужную цену продажи.


Можно конкретный пример запроса?

Автор: kapbepucm 1.5.2008, 20:21
Ну, например:
Код
SELECT (Field1*1.3)as Field2 from Table1

Автор: Treod 2.5.2008, 15:30
Цитата

SELECT (Field1*1.3)as Field2 from Table1


 Как сделать с помощью этого запроса, чтобы в поле "Стоимость продажи" автоматически добавлялась сумма?

SQl запрос в моем случае примет вид:
Код

SELECT (([Стоимость закупки])*1.3) AS [Стоимость продажи]
FROM Товары;


Или же придется вручную обращаться к запросу и копировать стоимость продажи?

Автор: kapbepucm 2.5.2008, 19:42
Для чего в таблице "Товары" поле "Количество"?

Цитата(Treod @  2.5.2008,  15:30 Найти цитируемый пост)
Как сделать с помощью этого запроса, чтобы в поле "Стоимость продажи" автоматически добавлялась сумма?
В таблице "товары"?

Автор: Treod 2.5.2008, 20:11

Цитата

Для чего в таблице "Товары" поле "Количество"?

Количество товара.

Цитата

В таблице "товары"?

Да)

Автор: kapbepucm 3.5.2008, 09:45
Цитата(Treod @  2.5.2008,  20:11 Найти цитируемый пост)
Количество товара
Количество товара в определённом заказе или остаток товара на складе магазина?
Цитата(Treod @  2.5.2008,  20:11 Найти цитируемый пост)
Да
Зачем?

Добавлено через 1 минуту и 50 секунд
Цитата(kapbepucm @  1.5.2008,  17:43 Найти цитируемый пост)
хранить в таблице туже самую цену, только умноженную на 1,3 необязательно

Автор: Treod 3.5.2008, 09:47
Ниже приведена форма поставки. Мне необходимо, чтобы при занесении в поле "Стоимость закупки" данных, автоматически данные переносились в поле "Стоимость продажи" с наценкой.

user posted image

Добавлено через 1 минуту и 40 секунд

Цитата

Количество товара в определённом заказе или остаток товара на складе магазина?


Количество поставляемого товара.

Добавлено через 3 минуты и 25 секунд
Может у меня не хватает таблицы? Таблица Товары у меня одна. Она используется и при поставке и при заказе товара. Может посоветуете какую еще добавить таблицу?

Автор: kapbepucm 3.5.2008, 11:14
Наконец до меня дошло... smile
Я бы объединил таблицы:
1)"Клиенты" и "Поставщик" в "Партнёры"
2)"Заказы" и "Поставка" в "Документы"
3)"Строки заказа" стали бы "Строки документа". Ну и количество если это заказ умножать на (-1)
Ну а если оставлять так, то:
1)Нужна ещё таблица наподобие "Строки заказа" между "Товары" и "Поставка"
Код
===========================
    Строки поставки
---------------------------
  LineID
  Код поставки
  Код товара
  Количество
===========================
2)Из таблицы "Товары" убрать "Количество", "Код поставки", "Стоимость продажи". Таблица "Товары" будет содержать параметры товаров.

Автор: Treod 3.5.2008, 12:46
А может же быть, что в таблице "Товары" не будет конкретно поставляемого товара. Или сначала его необходимо внести в таблицу "Товары"?

Большое спасибо за помощь, но все же имеются еще пару вопросов:
1) В таблице "Товары" будут содержаться товары, имеющиеся в мвгазине? .
2) Как я могу убрать из таблицы "Товары" поле "Стоимость продажи"? Попробую объяснить на примере. Допустим в магазин поставляется товар от фирмы ООО "ХХХ". Поставляется процессор стоимостью 5600 руб. Клиенту мы его продаем уже за 6000 руб. Где будет храниться стоимость товара, когда мы осуществляем продажу?

Добавлено через 1 минуту и 24 секунды

Может необходима таблица "Склад магазина"?

Автор: kapbepucm 3.5.2008, 15:16
Цитата(Treod @  3.5.2008,  12:46 Найти цитируемый пост)
А может же быть, что в таблице "Товары" не будет конкретно поставляемого товара. Или сначала его необходимо внести в таблицу "Товары"?
Чаще всего так и есть. В таблице товары, если будут произведены мною упомянутые манипуляции, хранится "отсранённая" информация, которая к складу магазина особо и не относится. Там хранится описание кодов, которые задействованы в неких документах. При регистрации закупки сначала создаётся товар.

Добавлено через 4 минуты и 42 секунды
Мне непонятно следуещее:
Цитата(Treod @  3.5.2008,  12:46 Найти цитируемый пост)
Поставляется процессор стоимостью 5600 руб. Клиенту мы его продаем уже за 6000 руб

Цитата(Treod @  1.5.2008,  17:04 Найти цитируемый пост)
Да, всем товарам будет наценка 30%. 

5600*1.3=7280

Автор: Treod 3.5.2008, 15:21

Значит все же следует создать таблицу "Склад товаров"? Или можно обойтись и без нее?

Автор: kapbepucm 3.5.2008, 15:23
Цитата(Treod @  3.5.2008,  12:46 Найти цитируемый пост)
Может необходима таблица "Склад магазина"
Думаю, что нет. Остаток может посчитать запрос.

Автор: Treod 3.5.2008, 15:27
Цитата

Думаю, что нет. Остаток может посчитать запрос.


Если не сложно, можно привести листинг запроса? Буду благодаренsmile

Думаю можно добавить поле "Наличие товара".

Добавлено через 2 минуты и 6 секунд

И еще вопрос:
Что же делать со стоимостью продажи? Или просто оставить поле "Цена товара"?

Автор: kapbepucm 3.5.2008, 15:36
Цитата(Treod @  3.5.2008,  15:27 Найти цитируемый пост)
Думаю можно добавить поле "Наличие товара"
Думаю не стоит. Запрос всё наидет что есть, а чего нет на складе.
Цитата(Treod @  3.5.2008,  15:27 Найти цитируемый пост)
Что же делать со стоимостью продажи? Или просто оставить поле "Цена товара"?
Для начала просветлите меня

Цитата(kapbepucm @  3.5.2008,  15:16 Найти цитируемый пост)
Мне непонятно следуещее:

Цитата(Treod @  3.5.2008,  12:46 )
Поставляется процессор стоимостью 5600 руб. Клиенту мы его продаем уже за 6000 руб



Цитата(Treod @  1.5.2008,  17:04 )
Да, всем товарам будет наценка 30%. 


5600*1.3=7280 


Автор: Treod 3.5.2008, 15:40
Цитата

5600*1.3=7280 


Я просто привел пример, не стал уж вычислять 30%.

По сути всем товарам будет одинаковая надценка.

Добавлено через 1 минуту и 49 секунд
А как будет выглядеть запрос, который подсчитывает остаток?

Автор: kapbepucm 3.5.2008, 17:59
Цитата(Treod @  3.5.2008,  15:27 Найти цитируемый пост)
Что же делать со стоимостью продажи? Или просто оставить поле "Цена товара"? 
Запустите вот этот запрос, я думаю часть вопросов отпадёт:
Код
SELECT ([Строки заказа].[Код]) AS [Код документа], [Товары].[Наименование], [Строки заказа].[Количество], ([Товары].[Стоимость закупки]*1.3) AS [Стоимость подажи], ([Строки заказа].[Количество]*([Товары].[Стоимость закупки]*1.3)) AS Сумма
FROM [Строки заказа] LEFT JOIN Товары ON [Строки заказа].[Код товара]=[Товары].[Код];

Цитата(Treod @  3.5.2008,  15:40 Найти цитируемый пост)
А как будет выглядеть запрос, который подсчитывает остаток?
Гм... С тои схемой, которая у вас сейчас на данный момент- не знаю. Может всё же произведёте одну из двух манипуляций?
1)
Цитата(kapbepucm @  3.5.2008,  11:14 Найти цитируемый пост)
Я бы объединил таблицы:
1)"Клиенты" и "Поставщик" в "Партнёры"
2)"Заказы" и "Поставка" в "Документы"
3)"Строки заказа" стали бы "Строки документа". Ну и количество если это заказ умножать на (-1)

2)
Цитата(kapbepucm @  3.5.2008,  11:14 Найти цитируемый пост)
1)Нужна ещё таблица наподобие "Строки заказа" между "Товары" и "Поставка"
Код
===========================
    Строки поставки
---------------------------
  LineID
  Код поставки
  Код товара
  Количество
===========================
2)Из таблицы "Товары" убрать "Количество", "Код поставки", "Стоимость продажи". Таблица "Товары" будет содержать параметры товаров. 


Добавлено через 3 минуты и 8 секунд
В этих двух вариантах- знаю smile

Автор: Treod 3.5.2008, 18:15
Провел 2-ую манипуляцию.

user posted image

Добавлено @ 18:26

Цитата

Запустите вот этот запрос, я думаю часть вопросов отпадёт:


С запросом то мне все понятно. Вводим стоимость товара, выводится стоимость продажи.
Вот листинг моего запроса:
Код

SELECT Товары.Код, Товары.Наименование, (([Цена товара])*1.3) AS [Стоимость продажи]
FROM Товары;


 Но как сделать, чтобы стоимоть продажи сразу вносилась в таблицу "Товары" поле "стоимость продвжи"?

Автор: kapbepucm 3.5.2008, 18:34
Цитата(Treod @  3.5.2008,  18:15 Найти цитируемый пост)
Вводим стоимость товара, выводится стоимость продажи
Нет. Вводим код товара (конечно необязательно код, для конечного пользователя можно сделать раскрывающийся список, и код, который нужен, сам введётся) вводим количество, а всё остальное самостоятельно где надо посчитается.

Автор: Treod 3.5.2008, 18:36
Да я оговорился. Вводим код товара. Но, повторю еще раз: мне нужно, чтобы стоимоть продажи сразу вносилась в таблицу "Товары" поле "стоимость продажи"

Добавлено через 3 минуты и 2 секунды
user posted image

Добавлено через 3 минуты и 56 секунд
Так приблизительно должна выглядеть таблица "Товары"

Автор: kapbepucm 3.5.2008, 19:09
Цитата(Treod @  3.5.2008,  18:36 Найти цитируемый пост)
мне нужно, чтобы стоимоть продажи сразу вносилась в таблицу "Товары" поле "стоимость продажи"
Думаю в таблице это сделать практически невозможно (Конечно, возможно, что мне это просто неизвестно). Но это можно сделать в форме прописав AfterUpdate(), например
Код
Private Sub Цена_закупки_AfterUpdate()
  [Цена продажи].Value = Round([Цена закупки].Value * 1.3, 2)
End Sub


И всёже, не понимаю чем вам не нравиться регистрировать новый товар в этом запросе:
Код
SELECT [Товары].[Код], [Товары].[Наименование], [Товары].[Характеристики], [Товары].[Цена закупки], round([Товары].[Цена закупки]*1.3) AS [Цена продажи]
FROM Товары;
для пользователя же выглядит одинаково?

Автор: kapbepucm 3.5.2008, 19:28
Остаток товара сделал в 5 этапов (для наглядности):
1)Запрос Ostatok1
Код

SELECT [Строки заказа].[Код товара], Sum([Строки заказа].[Количество]) AS Количество
FROM [Строки заказа]
GROUP BY [Строки заказа].[Код товара];

2)Запрос Ostatok2
Код
SELECT [Строки поставки].[Код товара], Sum([Строки поставки].[Количество]) AS Количество
FROM [Строки поставки]
GROUP BY [Строки поставки].[Код товара];

3)Запрос Ostatok3
Код

SELECT Ostatok1.[Код товара], Ostatok1.Количество
FROM Ostatok1
UNION ALL SELECT Ostatok2.[Код товара], (Ostatok2.Количество*(-1))as [Количество]
FROM Ostatok2;

4)Запрос Ostatok4
Код
SELECT [Ostatok3].[Код товара], Sum([Ostatok3].[Количество]) AS [остаток на складе]
FROM Ostatok3
GROUP BY [Ostatok3].[Код товара];

5)Запрос Ostatok5
Код
SELECT [Товары].[Код], [Товары].[Наименование], [Товары].[Характеристики], [Товары].[Цена закупки], round([Товары].[Цена закупки]*1.3,2) AS [Цена продажи], [Ostatok4].[остаток на складе]
FROM Ostatok4 LEFT JOIN Товары ON [Ostatok4].[Код товара]=[Товары].[Код];

Автор: Treod 3.5.2008, 19:57

Спасибо большое за помощь. Для цены продыжи оставлю просто запрос. С остатком пока разбираюсь. Еще раз огромное спасибо.

Автор: bopoha 3.5.2008, 23:44
Treod, чем больше цифр будет захарткодано в коде, тем труднее будет сопровождать программу. После разработки попробуй найти разбросанную 1.3 в коде. Надбавка поменяется. Как пить дать. Если не хочется выносить в настройки, то можно сделать фукнцию для вычисления. И использовать ее везде. При измнении понадобится поменять только в одном месте.

Автор: Treod 7.5.2008, 18:30
Пытаюсь создать запрос, выдает ошибку.
Код

SELECT [Строки заказа].Код, [Строки заказа].[Код заказа], [Строки заказа].[Код товара], [Строки заказа].Количество, ( ([Строки поставки].[Цена закупки])*1,3) AS ([Строки заказа].[Цена продажи])
FROM (Товары INNER JOIN [Строки заказа] ON Товары.Код = [Строки заказа].[Код товара]) INNER JOIN [Строки поставки] ON Товары.Код = [Строки поставки].[Код товара];


Произвел некоторые изменения:
1) "Цену продажи" занес в "Строки заказа"
2)"Цену закупки" в "Строки поставки"

user posted image

Автор: bopoha 8.5.2008, 00:03
Цитата(Treod @  7.5.2008,  18:30 Найти цитируемый пост)
AS ([Строки заказа].[Цена продажи])


Укажите новое имя без таблицы

Автор: Akina 8.5.2008, 08:35
Всё, надоело.

Автор: Akina 8.5.2008, 08:35
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена!

Автор: Treod 8.5.2008, 15:42

Цитата

Укажите новое имя без таблицы


Спасибоsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)