XRushdy Ответов: 1

Консультации по проектированию базы данных инвентаризации


I have a question about inventory project database design

Instead of creating a [ProductBalance] column in products table, I left the balance undefined and created another table [Log]
Log_ID || Product_ID || OperationType_ID   || Input || Output
1            29           1 (Purchases)         5        0
2            24           4 (Sales)             0        2
3            24           5 (SaleReturn)        1        0

* OperationType_ID is related to another table[OperationTypes]

Now when user select some product the query will SUM(Input) - SUM(Output) for this product to get the current balance.


Что я уже пробовал:

This worked well till now, but i want to know is this design is bad?
For example when i wanted to get total sales and saleReturn for products i tried this:
SELECT SUM(A.Output) AS Sales, SUM(B.Input) AS SaleReturn
FROM
(SELECT * from Log WHERE Log.OperationType_ID = 2) A
FULL JOIN
(SELECT * FROM Log WHERE Log.OperationType_ID = 5) B ON A.Stock_ID = B.Stock_ID

1 Ответов

Рейтинг:
8

MadMyche

Во-первых, определение, которое вы даете в разделе "содержание", не соответствует условию, которое вы даете в запросе

OperationTypeID = 4 (Sales)

SUM(A.Output) AS Sales = (SELECT * from Log WHERE Log.OperationType_ID = 2)

Во-вторых, ваш вопрос кажется довольно многословным. Вы могли бы заменить это чем-то гораздо более простым
SELECT Sales = Sum(Output), SalesReturn = Sum(Input)
FROM @log
WHERE OperationTypeID IN (4, 5)

Что касается дизайна таблицы журнала, то у меня были бы дополнительные столбцы для таких элементов, как LogDateTime & TransactionID. Я также испытываю отвращение к именам столбцов, которые являются либо ключевыми словами, либо зарезервированными словами; обратите внимание, что Output синий цвет в запросе, поэтому я бы, вероятно, переименовал его во что-то вроде InventoryRemoved, а затем изменил входной столбец, чтобы он был аналогично назван как InventoryAdded


XRushdy

Сэр, я так благодарна, это сработало.
мой старый запрос о присоединении таблицы к самой себе был слишком сложным, и я беспокоился об этом,
таблица уже содержит больше столбцов, я просто попытался показать простой пример идеи и узнать мнения экспертов о дизайне базы данных, что идея (SUM(InventoryAdded) - SUM(InventoryRemoved)) повлияет на производительность в будущем, когда таблица станет больше?

MadMyche

Я просто поделился своими мыслями - похоже, ты уже это имел в виду.
Естественно, по мере увеличения количества строк производительность будет пропорционально снижаться, но я действительно не буду потеть. Я бы, вероятно, не делал весь журнал сразу, а скорее бросал бы группу по ProductID и делал ежемесячный отчет по продукту за период времени - было бы гораздо полезнее для анализа тенденций и т. д