Postgresql

使用 PostgreSQL 計算股票價值

  • March 14, 2021

我正在開發庫存系統網路應用程序。它基於最新的 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 INTOorpurchasessales時都更新該欄位。在這種情況下不需要**觸發器。**此外,您應該確保更新products.stock發生在與表和表相同的事務中。INSERT INTO``purchases``sales

或者,您也可以將架構設計為不將stock欄位儲存在products表上。而是創建一個將 、 和 連接在一起的視圖,在和上分組聚合其和中的差異,這樣,只要或發生變化,它就會立即始終保持最新狀態。products``purchases``sales``product``purchases``sales``product``stock``purchases``sales

引用自:https://dba.stackexchange.com/questions/286985