需要有关产品及其规格的数据库设计方面的帮助

时间:2014-01-14 11:13:51

标签: database-design

不同的产品有不同的规格。产品也分类。如何解除这种需求?任何想法都将受到高度赞赏。例如 -

Sony Xperia ZL

    General Features
        Form - Touch
        SIM  - Single SIM, GSM 
    Software
        OS Version   - Android OS, v4.1.2 (Jelly Bean)
        Operating Freq   - GSM - 850, 900, 1800, 1900; UMTS - 2100 
    Display
        Type -  TFT Capacitive
        Size -  5-inch 



LG HD LED Television

    GENERAL
        Model   47LN5710
        Screen Type     -
        Display Size    47 Inch 

    VIDEO FEATURES
        Aspect Ratio    -
        Dynamic Ratio   -
        View Angle  178 Degree 

1 个答案:

答案 0 :(得分:2)

这取决于你使用它的目的。有一个简单的解决方案,创建一个表,例如'Spec Attributes',只有两列:Product Id,Spec Name,Spec Value。这将是一个简单的解决方案 - 但不提供支持或数据完整性。

更好的解决方案是围绕属性设置一些保护措施。与上面类似,它将涉及一个表,它将你的'列'(即SIM,OS版本)存储为行。我建议使用预定义的属性甚至“类型”来限制您正在使用的属性,以便更容易查询。

例如,

  DeviceTypes
  DeviceTypeId |     Name
  01           |     Camera
  02           |     Television
  03           |     Mobile Phone

  Category
  CategoryId   |     Name
  01           |     General
  02           |     Video Features

  DeviceAttributeTypes
  DeviceAttribTypeId| DeviceTypeId | CategoryId    |AttributeName  |    DataType
  01                | 01           | 01            | SIM           | Varchar
  02                | 01           | 01            | Size          | NUMBER
  03                | 02           | 02            | Display Size  | NUMBER
  04                | 02           | 01            | Model         | Varchar

  DeviceAttribut
  DeviceId  |  DeviceAttirbTypeId |  Value  
  13        |  01                 |  Single Sim, GSM
  13        |  02                 |  5
  14        |  04                 |  47LN5710

在此示例中,您将使用您想要的属性和类型对设备类型和类别表进行“硬编码”。这使您可以选择按类型或类别过滤属性。

即。要获取所有设备及其属性的列表,您可以使用下面的查询。然后,您可以在ID或类别或设备类型的名称上添加'WHERE'

  SELECT d.DeviceName
  ,      dat.AttributeName
  ,      dar.Value
  FROM   Device d
         LEFT JOIN DeviceAttribute da
           ON d.DeviceId = da.DeviceId
         LEFT JOIN DeviceAttributeType dat
           ON da.DeviceAttribTypeId = dat.DeviceAttribtypeId

要在需要返回属性为列的结果集的地方进行查询,我总是使用; with annotation。 (示例here