我正在建立一个销售服装的新网站。我自己制作了大部分内容,我想创建一个网站来销售它们。
我想要一个高级搜索,允许用户使用不同的标准进行搜索:
所以我有以下的shcema:
product:
id int(10) unsigned not null primary key auto_increment
name varchar(200),
price float(5,2),
color_code_1 int(5) default 0,
color_code_2 int(5) default 0,
color_code_3 int(5) default 0,
color_code_4 int(5) default 0,
color_code_5 int(5) default 0,
etc...
我现在遇到的问题是,如果我搜索1种颜色(例如红色)并且红色的颜色代码在color_code_5
中,搜索将不会返回任何结果。因为我的脚本寻找1种颜色,因此只查找color_code_1。
所以我的问题是,还有更好的方法吗?
//4 = red
... WHERE color_code_1 = 4 OR color_code_2 = 4 OR color_code 3 = 4 OR color_code 4 = 4 OR color_code 1 = 5 OR
问题是如果我添加更多颜色,我将不得不更改所有查询,我认为执行速度不是很快?
这样做的最佳方式是什么?
答案 0 :(得分:2)
一种常见的最佳做法是创建一个包含所有颜色的表(字典表)。然后通过添加相应的外键,根据要构建的关系使用该表。在您的情况下,每种产品需要多种颜色,因此需要多对多的关系。要实现这一目标,您需要创建多对多的表并将产品与多种颜色相关联。
product:
id int(10) unsigned not null primary key auto_increment
name varchar(200),
price float(5,2),
color:
id int(10)
name varchar(100) /*e.g. red*/
product_color:
color_id int(10)
product_id int(10)
正如您已经意识到的那样,您可以拥有许多颜色,以及制造商的其他属性。在这种情况下,您创建一个表(字典表),其中包含该信息并将外键添加到您的产品表(如果它是一对多关系)或另一个多对多表(如果产品有许多制造商,反之亦然)。
答案 1 :(得分:1)
将颜色存储在单独的表格中。
product_color
product_id int,
color int
然后您可以执行以下选择:
select
id, name, price
from
product p
where
/* Select all products that have at least the color red */
exists (
select 'x'
from product_color pc
where pc.product_id = p.id
and pc.color = 1)
但是,如果是appararel,您可能需要创建一个存储属性组合的单独表,因为您可能也没有所有大小的“绿色”,因此您可能会获得product_variation
表包含多个记录,每个记录描述大小,材料和颜色。从那里你甚至可以进一步分割它(例如,每个变体允许多种颜色和材料),但你现在可能不需要它。