如何构造一个表以使该字段保持原子状态?

时间:2009-06-17 13:17:18

标签: php mysql database-design shopping-cart atomic-values

我有一个购物车,我必须跟踪库存,这包括带有属性的库存。例如:

shirt
 -- blue, small  = 50
 -- blue, medium = 22
 -- blue, large  = 53
 -- red,  small  = 15
 etc...

这些字段目前由数据库中的逗号分隔,ID如下:

1,3
1,4
1,5
2,3

其中每个数字代表一个特定的属性(1 =蓝色,3 =小)。问题是,由于数据在数据库中不是原子的,因此变得非常难以使用,但是我无法想象如何构造表,因为可能存在无限多的项目组合,例如:

blue, small, long-sleeved

有人能建议更好的方法将这些信息存储在数据库中吗?我想过使用查找表,但由于属性数量的不同,这不起作用。

2 个答案:

答案 0 :(得分:4)

表:衬衫{shirt_id}

表:ShirtAttributeDefinitions {attribute_id,attribute_description}

表:ShirtAttribute {shirt_id,attribute_id}

这样,您可以通过向Table:ShirtAttributeDefinitions添加记录来继续定义新的ShirtAttributes。

示例:

你有两件衬衫:{shirt_id:1},{shirt_id:2}

你有五个衬衫属性:{attribute_id:1,attribute_description:blue},{attribute_id:2,attribute_description:small},{attribute_id:3,attribute_description:ladies},{attribute_id:4,attribute_description:red},{ attribute_id:5,attribute_description:men}

现在你的第一件衬衫是蓝色小女士衬衫,第二件衬衫是红色男士衬衫。所以你的ShirtAttribute表将有这些recrods:

{shirt_id:1,attribute_id:1},{shirt_id:1,attribute_id:2},{shirt_id:1,attribute_id:3},{shirt_id:2,attribute_id:4},{shirt_id:2,attribute_id: 5}

虽然这种方法有效,但最好还是制作Shirt表的这些属性字段。通过这种方式,您可以确保衬衫不具有“男士”和“女士”属性。这种方法只是一种严格符合你问题的肮脏方法。

JRH。

答案 1 :(得分:1)

属性表有什么问题?

create table Attributes (
    Id int not null identity etc,
    CartItemId int not null foreign-key etc,
    Name nvarchar(32),
    Value nvarchar(32)
)