具有不同属性的项的数据库结构

时间:2009-08-08 18:57:15

标签: sql database model

我正在开发一个衣服网络应用程序,并希望了解如何在我的mysql数据库中构建数据。

每件产品(服装项目)都会以多种方式进行摄影,让我们称之为“模式”。例如,衬衫将被拍照扣扣或解扣,和/或塞入/不藏入。一条裤子将具有不同的可能属性集。我想存储这些物品被拍照方式的信息,以便我以后可以使用这些信息以特定方式显示衣物。

因此,一种方法就是将所有可能的属性存储在单个表中,例如:

productId(FK,PK) modeId(PK) isLoose isTuckedIn 尺寸 HasSmthUnderneath

其中属性可以是另一个表中定义的值或代码,如果不适用于特定模式,则为NULL。

然后给出一个特定的productId和modeId,我想我可以过滤掉不适用的属性的NULL值,只使用相关的属性。

然而,我不确定这是否是存储这种值的理想方式,因为我会有很多NULL值,例如在一条仅以一种方式拍摄的裤子中。我听说过EAV模型,这个合适吗?

值得注意的是,属性的​​数量将由我决定,而不是由用户决定,并且不应该大幅改变;并且我的最终目标是提取特定模式的属性,以便我可以在我的应用程序中使用该数据。

如果有什么不清楚的话,抱歉!

3 个答案:

答案 0 :(得分:5)

我很想进行以下规范化架构设计

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表中来处理,但是通过在数据库中建立关系,它将更加突出,可见且易于维护。

答案 1 :(得分:1)

我认为你的设计很好。可以对其应用database normalization,这可能会为您提供以下设计:

  1. 每个属性有一个表,每个表都有(id,propvalue)对。仅为属性实际应用的项目向这些表中添加行。
  2. 有通用表(id,propname,propvalue),每个属性数据类型(布尔值,数字,字符串)可能有一个这样的表。
  3. 根据你的描述,我觉得要么是矫枉过正。唯一的例外是属性是多值的(例如可用颜色列表)

答案 2 :(得分:1)

我个人认为这种类型的东西的普通旧键/值对被低估了,所以如果你很乐意在应用程序本身中更多地控制它,你也可以这样做:

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)
)

......虽然这可能是多余的。

只是另一种选择,不确定我是否自己这样做(取决于简介)。我的规格是否正确?