mysql - 多品类、多子功能产品的数据库设计

标签 mysql database schema

假设您正在为网上商店设计一个可搜索的数据库,并且遇到如下情况:

<小时/>

每个产品都会有多个不同的类别

例如,将 MARKER 视为产品

例如:同一个 MARKER 可能具有以下所有三个作为其类别:

  • 玩具
  • 学校文具
  • 艺术配饰

现在,每个类别都有一组相应的任意数量的参数(我们称之为功能),这些参数仅适用于该类别。

因此,对于其三个 product-category 表示中的每一个,上面的 MARKER 将具有多个不同的 product-feature-names 和各自的 product-feature -值

例如:我们可能有这些基于类别的功能名称和特定于产品的功能值:

  • 产品名称:::类别名称:::功能 1 名称 = 功能 1 值
  • MARKER:::TOY:::年龄组 = 6-12有毒 = 、< strong>圣诞节特惠 =
  • 标记:::学校文具:::批量可用性 =
  • MARKER:::ART-ACCESSORY:::使用 = 精细绘图兼容表面 = 全部
<小时/>

对于这种情况最好/最优化的设计是什么?

<小时/>

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

PRODUCT-TABLE

id, product_name

CATEGORY-TABLE

id, fk_product_id, fk_category_name

FEATURE-TABLE

id, fk_category_id, feature_name, feature_value

最佳答案

只需让数据库说明情况即可。

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 查询结合了条件和表。查询的含义由条件和上面给出的表含义组合而成。

参见this stackoverflow post from today或 EAV 和 OTLT 上的无数其他内容。 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 元数据的表中的值。

关于mysql - 多品类、多子功能产品的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24150409/

相关文章:

php - 无法按 id&&dept 获取每个员工的总金额

php - 到另一个页面的超链接不起作用

mysql - 如何将具有 1 对多关系的表合并为 1 行记录

php - 减少 MySQL 查询数量并按正确顺序输出数据

php - 数据库驱动的 Web 应用程序的最佳解决方案?

javascript - 当我通过 graphiql 发送查询时,graphql JS 返回 null

java - 使用多个数据库目录对 Hibernate 进行单元测试

database - 是否有可以版本控制的并发访问数据存储格式?

c# - 为什么 "SELECT * FROM user"会抛出语法错误?

database - 带评分的检查/考试问题/答案的架构