Postgresql

在雜貨店物品數據庫中處理不同類型測量的更好方法是什麼

  • March 10, 2017

在為雜貨店設計數據庫時,我遇到了“不同尺寸提供相同產品”的要求 - 例如,可以說綠豌豆有 250 克、500 克、1 公斤等。

我的問題是:在產品表中重複輸入具有不同測量值的產品或將測量值保存在具有產品 ID 的不同表中是一種好習慣嗎?

使用postgresql-unit

我很擅長類型。我會為此使用副檔名。如果您不在美國並使用英制單位,請查看 Christoph Berg 的創意postgresql-unit。首先建構擴展

sudo apt-get install bison flex build-essentials libpq-dev
git clone "https://github.com/ChristophBerg/postgresql-unit"
cd postgresql-unit
make
sudo make install

然後在您的數據庫上安裝擴展並配置您的表。

CREATE EXTENSION unit;

CREATE TABLE products (
 id     serial        PRIMARY KEY,
 name   text          NOT NULL,
 unit   unit          NOT NULL,
 price  numeric(7,2)
);

INSERT INTO products ( name, unit, price )
VALUES ( 'Green Peas', '250 g', '2.99' );

# SELECT name, unit, price FROM products;
   name    | unit  | price 
------------+-------+-------
Green Peas | 250 g |  2.99

# SELECT name, unit @ 'kg' AS unit, price FROM products;
   name    |  unit   | price 
------------+---------+-------
Green Peas | 0.25 kg |  2.99

INSERT同樣,如果需要,您可以在其他單位。它們將儲存在這些單位中,但您可以選擇任何您想要的單位。

INSERT INTO products ( name, unit, price )
VALUES ( 'KY Jelly', '1 kg', '8.00' );

# TABLE products;
id |    name    | unit  | price 
----+------------+-------+-------
 2 | Green Peas | 250 g |  2.99
 3 | KY Jelly   | 1 kg  |  8.00

# SELECT id, name, unit @ 'g' AS unit, price FROM products;
id |    name    | unit   | price 
----+------------+--------+-------
 2 | Green Peas | 250 g  |  2.99
 3 | KY Jelly   | 1000 g |  8.00

您可能會發現更容易儲存具有不同尺寸的每種產品,在產品表上每行一次。這似乎違反了規範化規則(我想它確實有點),但是隨著時間的推移,當您添加/刪除項目和製造商創建新口味的產品但尺寸組合略有不同時,您最終會將您的產品拆分為產品表太多,無法維護。

一個很好的例子是巧克力棒。

雀巢推出了一種新的巧克力棒“Fraggleiscious”。一年後,他們發布了“Fraggleicious Mint”。2 個月後,他們將薄荷條的重量從 50 克減少到 45 克,並改變了價格點,同時保持原來的大小不變。4 個月後,他們生產出兩種口味的“Fraggleicious Mini”,均為 25 克。請記住,每次更改可能會或可能不會發布不同的條碼。

您的系統必須滿足所有這些要求,並且能夠隨時辨識所有物品,因為您可能需要 2 年的時間才能將所有物品售罄。您可能會發現擁有一個帶有名稱/風味/尺寸組合的產品表是最好的,因此您將擁有:

Fraggleicious / Original / 50g
Fraggleicious / Mint / 50g
Fraggleicious / Mint / 45g
Fraggleicious Mini / Original / 25g
Fraggleicious Mini / Mint / 25g

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