Postgresql
使用 PostgreSQL 計算股票價值
我正在開發庫存系統網路應用程序。它基於最新的 Ruby on Rails 和 PostgreSQL。我需要根據採購和銷售數量跟踪產品庫存價值。您可以查看我的簡化數據庫架構(如下所示)。
表產品有一個庫存欄位。該欄位必鬚根據產品的總採購和銷售數量計算。
SUM(purchases.quantity) - SUM(sales.quantity)
我正在尋找簡單、高效且最重要的比賽條件安全解決方案。我目前(但不是最終)的想法是在這裡使用數據庫觸發器。但我不介意如何以正確的方式實施它們。
CREATE TABLE products ( id INT GENERATED ALWAYS AS IDENTITY, name varchar, stock INT NOT NULL DEFAULT 0 CHECK (stock >= 0), PRIMARY KEY (id) ); CREATE TABLE purchases ( id INT GENERATED ALWAYS AS IDENTITY, quantity INT NOT NULL DEFAULT 0, product_id INT NOT NULL, CONSTRAINT fk_product FOREIGN KEY (product_id) REFERENCES products (id) ); CREATE TABLE sales ( id INT GENERATED ALWAYS AS IDENTITY, quantity INT NOT NULL DEFAULT 0, product_id INT NOT NULL, CONSTRAINT fk_product FOREIGN KEY (product_id) REFERENCES products (id) ); INSERT INTO products (name) VALUES('Super Power'); INSERT INTO purchases (product_id, quantity) VALUES(1, 2), (1, 3), (1, 2); INSERT INTO sales (product_id, quantity) VALUES(1, 1), (1, 2), (1, 2); SELECT * FROM products
我不確定您是否有很多問題,只要您
products.stock
每次使用INSERT INTO
orpurchases
表sales
時都更新該欄位。在這種情況下不需要**觸發器。**此外,您應該確保更新products.stock
發生在與表和表相同的事務中。INSERT INTO``purchases``sales
或者,您也可以將架構設計為不將
stock
欄位儲存在products
表上。而是創建一個將 、 和 連接在一起的視圖,在和上分組並聚合其和中的差異,這樣,只要或發生變化,它就會立即始終保持最新狀態。products``purchases``sales``product``purchases``sales``product``stock``purchases``sales