php - 数据库结构(mysql): How to manage the set of specifications for every subcategory?

标签 php mysql database-design

我正在使用 PHP 和 MySQL 构建一个在线商店,但我遇到了一个很大的困境。 该商店有大约 50 个产品子类别,例如:笔记本电脑、上网本、HDD、RAM、软件、游戏等),其中分为 8 个主要类别(例如:笔记本电脑 [笔记本电脑、上网本...等])。

因此,现在对于每种产品,客户都希望管理规范字段或属性。但有50套规范各不相同。 基本上如何做到这一点?

我想我必须在数据库中创建 50 个具有特定字段的表。另一个想法是制作 8 个大表,其中包含所有子类别的所有规范字段,如果规范不适用于该产品,则用“null”填充它......这是错误的,因为插入产品时我不知道如何构建插入过程来执行此操作

INSERT INTO table_name VALUES ('','','','','','some specification','','some specification'....etc)`

如何管理每个子类别的规范集?

规范如下:

  • 制造商:索尼
  • 处理器:英特尔酷睿 i3
  • 内存:3 GB DDR3

规范需要由店主创建...他想为每个子类别设置规范...例如:笔记本电脑需要有这个规范(制造商,处理器,内存...等),硬盘需要有这个规范(容量、转速等)...所以基本上他想创建规范,这太复杂了...如果规范得到修复,问题就消失了。

每种产品都有不同的规范...(不仅是规范名称,还有规范本身。例如显卡、内存、硬盘等)。

最佳答案

我认为最好有单独的属性表,如下所示:

create table attributes(
    id bigint not null AUTO_INCREMENT PRIMARY KEY,
    attribute_name varchar(300),
    #any other field definitions, like data type, allowed range, etc.
)

以及链接表category_attribute,就像这样:

create table category_attribute(
    category_id int references category(id),
    attribute_id int references attributes(id),
    str_value varchar(1000),
    #if you are going to have different data types for each attribute you'll add it here
    #int_value int,
    #date_value timestamp ...
)

因此,您将拥有非常灵活的架构,允许您轻松添加/删除/修改属性和类别=>属性关系。

用于检索适用于 id =1 类别的所有属性的 SQL:

select * 
from attributes a
join category_attribute ca on ca.attribute_id = c.id
join category c on c.id = ca.category_id
where c.id = 1 #or any other condition here

这也会减少存储的数据量。

实时示例(仔细阅读您的问题并稍微更改架构,我相信更改是显而易见的):

category(1,'Computers')
category(2,'Cell Phones')

attribute(1, 'Manufacturer')
attribute(2, 'Cost')
attribute(3, 'GSM standards')
attribute(4, 'Hard Disk capacity')

category_attribute(id=1,category=1,attribute==1)
category_attribute(id=1,category=1,attribute==2)
category_attribute(id=1,category=1,attribute==4)
category_attribute(id=1,category=2,attribute==1)
category_attribute(id=1,category=2,attribute==2)
category_attribute(id=1,category=2,attribute==3)

product(1, 'iMac', category = 1)
product(2, 'iPhone', category = 2)

product_attribute(product_id=1, category_attribute_id=1, 'Apple')
product_attribute(product_id=1, category_attribute_id=2, '$300')
product_attribute(product_id=1, category_attribute_id=4, '500Gb')
product_attribute(product_id=2, category_attribute_id=1, 'Apple')
product_attribute(product_id=2, category_attribute_id=2, '$200')
product_attribute(product_id=2, category_attribute_id=3, 'GSM 900/1800/1900')

关于php - 数据库结构(mysql): How to manage the set of specifications for every subcategory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6992995/

相关文章:

php - Mysql:在值更新之前锁定表以进行读取

php - 外键约束 MySQL

MySQL Insert Select 不强制执行 NOT NULL 约束

php - 数据库设计 : Assigning a File to multiple Users

php - 数据验证优化

php - 如何从数组进行分页?

sql - 数据库设计 : Unique Billing Assocation

sql - 为引用特定结果的用户设计数据库表

php - 使用 PHP 将 POST 数据从一个网页传递到另一个网页

java - MySQL以库尔德字体存储数据?