2010-06-29 54 views
3

對於電子商店我MySQL的:產品屬性,庫存水平

  • 產品表(編號,名稱,價格,描述)
  • 屬性表(屬性名,屬性值,product_id_fk)

屬性名稱示例包括:大小,顏色和屬性值示例包括:XL,L,紅色,藍色。

什麼是存儲庫存水平的最佳方式?一個「袋子」產品可能以L /紅色存貨,但不是XL /紅色,而所有尺寸藍色的產品都可能有庫存。每個產品可能有超過2個屬性。

第三張桌子肯定是需要的。我認爲最好的方法是每個屬性一列,併爲product_id_fk增加一列。這意味着如果爲任何產品添加新屬性,則需要在庫存表中創建一個附加列

或者還有更好的方法嗎?

+0

產品可以擁有的最大屬性數量是多少? – unutbu 2010-06-29 13:25:37

+0

目前存在,但將來可能會添加具有新屬性集的產品。我知道這會讓事情變得複雜...... – stef 2010-06-29 13:35:38

回答

3

看起來好像你有多對多的關係(即產品可以有很多屬性,屬性可以與許多產品相關聯)。因此,您最好的設計是有一個關係表,其中包含產品和屬性的ID。

products (id, name, price, description) 
attributes (id, attribute name, attribute value) 
product_attribute (product_id (PK,FK), attribute_id (PK,FK)) 

如果您對每個物理項目都有唯一的行,則可以使用該功能。如果你不這樣做,那麼你需要有一些能夠處理不同類型產品的東西。

product (id, name, price, description) 
product_type (id, product_id (FK), count) 
attributes (id, attribute name, attribute value) 
product_attribute (product_type_id (PK,FK), attribute_id (PK,FK)) 

PK =主鍵 FK =外鍵

+0

你能解釋一下這個僞語法嗎? (product_id(PK,FK),attribute_id(PK,FK)) – stef 2010-06-29 13:43:44

+0

如果我沒有弄錯,這個設置可以讓我管理一個紅色的包而不是一個紅色的XL包?在product_attribute中,我需要多個attribute_id值(大小,顏色)。對? – stef 2010-06-29 13:52:47

+0

這兩個設置將取決於您攜帶的內容。頂級的產品對汽車等獨特產品來說是最好的選擇。 如果您使用手提包,底部的會更好地滿足您的需求。紅色XL袋子的產品類型爲紅色小袋子,您將擁有product_type,等等。因此,您可能還需要product_type表中的說明列。 這比試圖爲每個獨特類型的包創建一個列要好,因爲您很快就會發現自己的列不夠用了,並且會在後面搞砸了。 – 2010-06-29 14:08:00

-1

爲什麼不創建這樣一個表:

show create table product\G 
*************************** 1. row *************************** 
     Table: product 
Create Table: CREATE TABLE `product` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(10) NOT NULL, 
    `price` float NOT NULL, 
    `color` enum('red','blue') NOT NULL, 
    `size` enum('L','XL') NOT NULL, 
    `stocklevel` int(11) NOT NULL, 
    `description` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 

當然,這有一個屬性數量有限,但它並不難根據需要更改表格以添加其他屬性。

例如,添加額外的顏色類型:

ALTER TABLE product MODIFY COLUMN `color` ENUM('red','blue','green') AFTER `price`; 

,並添加附加屬性:

ALTER TABLE product ADD COLUMN `condition` ENUM('good','bad','ugly') AFTER `size`; 

順便說一句,我認爲屬性表有問題。產品可以有屬性(redL),但(LXL)沒有任何意義。屬性表不會停止輸入這些數據。我認爲真實的屬性不是red,blue,LXL而是colorsize

+0

我也在考慮屬性。屬性表的唯一原因是保存可在產品之間共享的值(例如,爲XL添加$ 4)。這張表沒有這個能力,但你可能不需要它。另一件要考慮的事情是產品不會共享描述。您每次都必須輸入說明。如果你想改變描述,你必須改變它們的全部。除此之外,這是一個很好的解決方案。 – 2010-06-29 14:34:05

+0

@Justin:哦!大聲笑,我想知道一個屬性值是什麼... :)是的,我同意使用文本描述列可能是不正確的。也許stef可以將描述存儲在一個單獨的表中,並將它們與具有外鍵的產品相關聯... – unutbu 2010-06-29 14:44:22

+0

還有一個問題需要考慮。也就是說,如果您輸入的不是手提包,不使用顏色或大小,或者兩者都使用的產品,則必須輸入NULL值,通常不認爲是最佳做法,但如果需要可接受。 – 2010-06-29 14:44:59