具有不同属性的项目的数据库结构
我正在开发一个服装Web应用程序,并希望了解如何在我的mysql数据库中构建数据的建议。具有不同属性的项目的数据库结构
每件产品(衣物)都会以多种方式进行照相,我们称之为“模式”。例如,一件衬衫会被扣上扣子或扣子,或者被卷入/不卷入。一条裤子会有不同的属性。我想在拍摄这些物品的方式上存储信息,以便稍后可以使用该信息以特定方式显示服装物品。
所以一个方法是公正对待所有可能的属性存储在一个表中,是这样的:
的productId(FK,PK) modeId(PK) isLoose isTuckedIn 尺寸 HasSmthUnderneath
其中属性可以是另一个表中定义的值或代码,如果不适用于特定模式,则为NULL。
然后给定一个特定的productId和modeId,我想我可以过滤掉不适用的属性的NULL值,只使用相关的属性。
但是,我不确定这是否是存储这种值的理想方式,因为我会有很多NULL值,例如在仅以一种方式拍摄的一条裤子中。我听说过EAV模型,这是否合适?
可能值得注意的是,属性的数量将由我而不是用户来决定,不应该有太大的改变;而且我的最终目标是提取特定模式的属性,以便我可以在我的应用程序中使用该数据。
对不起,如果有什么不清楚!
我会被诱惑有以下规范化模式设计
Mode Table
id | mode_style
---------------
1 | buttoned
2 | unbuttoned
3 | tucked in
4 | untucked
Clothes Table
id | name | description
----------------------------
1 | shirt | mans shirt...
2 | dress | short sleeve
Clothes_mm_Mode Table (Junction/Map table)
mode_id | clothes_id
--------------------
1 | 1
1 | 2
3 | 3
然后你就可以轻松地查询那些有一个敞着显示
SELECT
c.id,
c.name,
c.description
FROM
Clothes c
INNER JOIN
Clothes_Mode cm
ON c.id = cm.clothes_id
WHERE
cm.mode_id = 2
如果某些类型的衣服都在始终显示的衣服同样的方式,即所有的衬衫总是有一个扣子和解扣显示,你可以拿出Clothes_mm_Mode
表,并引入一个共模式表,将模式映射到一个共同模式ID
Common_Modes Table
id | name | description
--------------------------------------------------
1 | Men's Shirt | Common Modes for a Mens shirt
2 | Women's Shirt | Common Modes for a Womens shirt
Common_Modes_mm_Mode Table (Junction/Map table)
common_mode_id | mode_id
--------------------------------------------------
1 | 1
1 | 2
2 | 1
2 | 2
,然后服装的每个项目有一个共同的模式类型
Clothing_Common_Modes Table
clothing_id | common_mode_id
----------------------------
1 | 1
相关联的这种设计的好处是,增加服装的新项目时,只有一条记录需要输入到通用模式表将服装项目与服装类型常见的模式相关联。当然这可以在没有共同模式表的情况下进行处理,方法是将适当的记录插入原始Clothes_mm_Mode
表中以获得新的服装项目,但通过在数据库中具有关系,它将更加突出,可见并且更容易保持。
我认为你的设计很好。这将有可能应用于database normalization它,它可能会给你或者以下设计:
- 有每个属性的一个表,每个(ID,propvalue)对。只为这些表中的属性实际应用的项目添加行。
- 具有通用表(id,propname,propvalue),也许每个属性数据类型(布尔,数字,字符串)是一个这样的表。
随着你的描述,我觉得要么是矫枉过正。唯一的例外情况是属性是多值的(例如,可用颜色列表)
我个人认为这种类型的东西的普通旧键/值对被低估了,所以如果你愿意更多地控制它在应用程序本身,你也可以做这样的事情:
create table ProductStates
(
ProductId int PK
ModeState nvarchar(200) PK
)
在我心目中的好和简单。您不会获得多余的空值;如果产品具有该模式,那么就有一排,如果没有的话。还意味着如果有新状态,则不需要更改模式。如果您希望可以将ModeState链接到ModeStates查找表,如果您认为完整性将会成为问题。
create table ProductStates
(
ProductId int PK
ModeStateId int PK
)
create table ModeStates
(
ModeStateId int PK
ModeStateDescription nvarchar(500)
(...whatever else you might need here)
)
...尽管这可能是多余的。
只是一个替代方案,不知道我是否会这样做(取决于简要说明)。我的规格是否正确?