具有多个类别和多个子功能的产品的数据库设计

时间:2014-06-10 20:38:23

标签: mysql database schema

假设您正在为网上商店设计可搜索的数据库,并出现如下情况:


每个product都有多个不同的categories

例如,将MARKER视为product

例如:相同的MARKER可能具有以下所有三个category

  • TOY
  • 校文具
  • ART-ACCESSORY

现在,每个category都有一组相应数量的参数(让我们称之为features)只适用于该类别。

因此,对于其三个product-category表示形式中的每一个,上面的MARKER将具有多个不同的product-feature-names和相应的product-feature-values

例如:我们可能会有这些基于类别的feature-names和特定于产品的feature-values

  • PRODUCT-NAME ::: CATEGORY-NAME ::: Feature1-name = Feature1-value 等。
  • MARKER ::: TOY ::: AgeGroup = 6-12 有毒 = ,< strong> ChristmasSpecial =
  • MARKER ::: SCHOOL-STATIONERY ::: BulkAvailability =
  • MARKER ::: ART-ACCESSORY ::: 使用 = 精细绘图 CompatibleSurface = 全部

针对此类情况的最佳/最佳设计是什么?


我的想法是使用三个表,但我不知道这对于以后检索数据是否最有效(也许这应该在两个表中完成,或者甚至只有一个?):

  

产品表

     

id,product_name

     

CATEGORY-TABLE

     

id,fk_product_id,fk_category_name

     

特征表

     

id,fk_category_id,feature_name,feature_value

1 个答案:

答案 0 :(得分:1)

让数据库说明是什么。

yn = yes,no
age_range = 0-4,4-6,6-12,...
use = Fine-Drawing,Canoeing,...
surface_group = All,PaperOrSkin,PaperOrWall,...
PRODUCT(p,n) -- product [p] is named [n]
TOY(p,AgeGroup,Toxic,ChristmasSpecial,...)
    -- [p] is a toy for age range [AgeGroup] and whether it's toxic is [Toxic] and whether it's on Christmas special is [ChristmasSpecial] and ...
SCHOOL-STATIONERY(p,BulkAvailability,...)
    -- [p] is school stationery and its bulk availability is [BulkAvailability] and ...
ART-ACCESSORY(p,Use,CompatibleSurface,...)
    -- [p] is an art accessory with use [u] and is compatible with surfaces in surface group [CompatibleSurface] and ...

SQL查询结合了条件和表。查询的含义由上面给出的条件和表格组合而成。

在EAV和OTLT上查看this stackoverflow post from today或其他数以万计的人。 Or this.另外,只需了解数据库设计。也许从here开始。

如果是/否选择分开,请注意事情更简单:

TOY(p,AgeGroup,...) -- [p] is a toy for age range [AgeGroup] and ...
TOY-TOXIC(p) -- toy [p] is toxic
TOY-XMAS-SPECIAL(p) -- toy [p] is on Christmas special
SCHOOL-STATIONERY(p,...) -- [p] is school stationery and ...
SCHOOL-STATIONERY-BULK-AVAILABLE(p) -- school stationery [p] is available in bulk

你可能也希望有时候不会为一组事物添加标签,而只是简单说明事物或范围内的第一件事和最后事:

age = 0,1,2,...
surface = Paper,Skin,Wall,...
TOY(p,...) -- [p] is a toy and ...
TOY(p,MinAge,MaxAge) -- [p] is a toy with age minimum [MinAge] and maximum [MaxAge]
ART-ACCESSORY(p,Use,...) -- [p] is an art accessory with use [u] and ...
ART-ACCESSORY-COMPATIBLE-SURFACE(p,CompatibleSurface) -- accessory [p] is compatible with surface [CompatibleSurface]

您始终可以更改当前硬连线信息(类型集和类型,列和表名称)。您始终可以编写甚至不知道什么是硬连线的通用查询,因为所有硬连线名称都是构成DBMS元数据的表中的值。