【问题标题】:How to design database, one table for all product type or each table for each product type?如何设计数据库,所有产品类型一个表或每个产品类型一个表?
【发布时间】:2011-11-29 20:13:31
【问题描述】:

我开始销售 T 恤和鞋子的新电子商务 Web 应用程序(宠物项目)。我的商店只有免费尺寸的 T 恤,所以 T 恤只有颜色栏,而鞋子有尺寸和颜色栏。

现在是时候创建表来存储这些数据了,我想知道为鞋子和 T 恤创建单独的表好还是将它们都放在一个表中更好?

如果存储此类数据有更好的想法,请告诉我。

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    您绝对不想创建 Shoe 表和 TShirt 表。您的商店可能会增长,并且有一天您将拥有一千个这样的产品表。为此编写 SQL 将是一场噩梦。另外,你最终可能会有不同种类的 T 恤,有些有颜色,有些有尺寸和颜色,等等。如果你为每个人创建一个新表,你很快就会忘记它们,如果你不这样做,为什么要为 T 恤和鞋子设置单独的表,而不是为单一尺寸的 T 恤和多尺寸的 t -衬衫?

    在设计数据库时,您应该问自己:我的领域中的实体是什么?什么是永不改变且唯一可识别的东西?在商店中,可以以特定价格出售的特定商品就是这样一个实体。因此,您可能有一个 products 表,其中包含您销售的每个特定商品的键,可能还有名称、类型、尺寸和颜色列:

     item
     id | type | name     | size  | color
     ------------------------------------
     1  | shoe | Marathon | 9     | white
     2  | shoe | Marathon | 9     | black
    

    查看此表,您会注意到我们有两个非常成功的马拉松跑鞋条目,这似乎违反了规范化。实际上,您可能有两个实体,一个可发货项目和一个目录产品。鞋子“Marathon”可能是在您的商店中只有一张图片和一个描述,然后是“有以下颜色和尺寸可供选择:”行。所以现在你有两个表:

    product
    id | type   | name        | supplier        | picture      | description
    --------------------------------------------------------------------------------------
    1  | shoe   | Marathon    | TrackNField Co. | marathon.jpg | Run faster than light!
    2  | tshirt | FlowerPower | SF Shirts       | fpower.jpg   | If you're going to San Francisco...
    
    
    item
    id | product_id | size | color | price
    --------------------------------------
    1  | 1          | 9    | white | 99.99
    2  | 1          | 9    | black | 99.99
    3  | 2          |      | blue  | 19.99
    

    产品表中的“类型”列可能很棘手。您可能希望按类别显示产品,让用户单击“鞋子”并获取所有类型为“鞋子”的产品。到目前为止很容易,但最终有人会错误输入“sheo”条目,然后你就再也找不到鞋子下的那个产品了。因此,最好将分类与产品分开,例如使用 product_type 表:

    product_type
    id | name
    ---------
    1  | shoe
    
    
    product
    id | type_id   | name        | supplier        | picture      | description
    --------------------------------------------------------------------------------------
    1  | 1         | Marathon    | TrackNField Co. | marathon.jpg | Run faster than light!
    

    引用产品表中的类型。只要您的类型层次结构保持浅层就可以了,但是如果您想要有子类别,例如“运动鞋”、“篮球鞋”、“麂皮鞋”等,该怎么办?一只鞋甚至可能属于这些子类别中的几个。这种情况你可以试试这个

    category
    id | name         | supercategory_id
    ------------------------------------  
    1  | shoe         |
    2  | running shoe | 1
    
    
    product_category
    product_id | category_id
    ------------------------
    1          | 2
    
    
    product
    id | name        | supplier        | picture      | description
    --------------------------------------------------------------------------------------
    1  | Marathon    | TrackNField Co. | marathon.jpg | Run faster than light!
    

    如果您想要显示多个分类层次结构(就像现在大多数大型电子商务网站所做的那样),您将不得不想出更复杂的东西。

    【讨论】:

      【解决方案2】:

      将它们全部放在一个表中,并有一个type 字段。这样做的原因是为了让您的数据结构具有可扩展性:即,如果有一种新类型的产品,那么您不必添加新表并且必须彻底更改您的应用程序代码,您只需使用同一个表并简单地添加type

      【讨论】:

        【解决方案3】:

        如果您不想让它变得复杂,您可以将它们全部放在同一个表中,并创建另一个名为“ProductType”的表,告诉您它是鞋子还是 T 恤。 这种关系在“ProductType”端是一对多的,因为您可以在产品表(您存储所有产品的位置)上拥有与多个记录相关联的相同类型的产品

        【讨论】:

          猜你喜欢
          • 2010-11-24
          • 1970-01-01
          • 2023-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多