Sabyasachi Mukherjee Ответов: 2

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


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

Столбцы таблицы выглядят следующим образом:

Item(F.key)----Qty----Date----IsCurrent


Атрибут item является внешним ключом к таблице items. Количество показывает запас на данную дату.

IsCurrent-это логическое значение, которое указывает, является ли данный запас самым текущим.

Таким образом, в любой момент времени для любого конкретного элемента может быть только одна запись с IsCurrent, установленным в true.

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

Я использовал индекс:

CREATE UNIQUE INDEX onlyonecurrent_index
    ON mycompany.stock USING btree
    (item COLLATE pg_catalog."default")
    TABLESPACE pg_default    WHERE iscurrent
;



Это устраняет ограничение. Однако это означает, что вставка записей в эту таблицу-это хлопотно. Я должен найти текущий запас, очистить флаг IsCurrent и затем ввести новую запись.

Я придумал два способа исправить эту проблему. Я могу вести две таблицы, одну StockHistory и другую CurrentStock, где архивные данные будут помещены в StockHistory.

Или я могу просто удалить флаг IsCurrent и отсортировать элементы по дате, чтобы получить самую последнюю запись.

Однако мне не нравится ни один из этих подходов.

Есть ли какой-нибудь испытанный способ справиться с подобной проблемой?

PIEBALDconsult

Ну, как правило (во всяком случае, на мой взгляд), такие вещи являются областью приложения, а не схемой базы данных.
Я предпочитаю не иметь столбца "iscurrent", а использовать даты начала и окончания для применимости записи.
Оставьте конечную дату нулевой или установите ее в далекое будущее, чтобы указать "текущую".
Это значительно упрощает несколько типов запросов.

Peter Leow

Разве акции с последней датой не являются самыми актуальными? Разве вы не можете использовать для этой цели поле даты в этой таблице?

Sabyasachi Mukherjee

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

Peter Leow

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

2 Ответов

Рейтинг:
14

RAMASWAMY EKAMBARAM

Метод А
Вы можете определить столбец "IsCurrent" таблицы "STOCK" как NULLable и определить уникальное ограничение для этого столбца.
Всякий раз, когда вы вставляете запись, генерируйте 2 SQLs:
(1)
обновление запаса установлены команду iscurrent = значение null где товар = &ЛТ;item_key&ГТ;
(2)
вставить в фондовые ценности (&ЛТ;item_key&ГТ;, &ЛТ;кол-во&ГТ;, &ЛТ;tran_date&ГТ;, правда)

Поскольку уникальное ограничение игнорирует нули это должно работать

Метод В
В качестве альтернативы создайте уникальный ключ транзакции (возможно, последовательность базы данных) для каждой транзакции и добавьте столбцы как в таблицы номенклатур, так и в таблицы запасов для хранения этого значения. Опять же вам нужно будет сгенерировать 2 SQLs:
(1)
вставить в фондовые ценности (&ЛТ;item_key&ГТ;, &ЛТ;кол-во&ГТ;, &ЛТ;tran_date&ГТ;, &ЛТ;trans_key&ГТ;)
(2)
обновление пункта LATEST_TRAN_KEY = &ЛТ;trans_key&ГТ; где item_key = &ЛТ;item_key&ГТ;

Разумеется, вы можете определить последнюю запись, где шток.tran_key = товар.latest_tran_key'

(Конечно, вы не можете определить ограничение внешнего ключа для этого элемента столбца.Latest_Tran_Key как вы уже определили внешний ключ для элемента столбца в таблице запасов)


Рейтинг:
0

RAMASWAMY EKAMBARAM

исправление в предыдущий пост - ограничение уникальности должен быть (продукт, команду iscurrent).