2010-06-29 108 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