gpt4 book ai didi

database - 如何为搜索后过滤构建数据库模式

转载 作者:搜寻专家 更新时间:2023-10-30 23:07:09 24 4
gpt4 key购买 nike

我想在电子商务搜索功能中添加搜索后过滤。目前的数据是这样的:

产品(带有 BrandID)品牌(产品表中 BrandID 的外键)ProductDietType(产品和饮食类型的连接表)DietTypes(各种产品饮食类型)ProductDepartment(产品和部门的联结表)部门

我想添加搜索后过滤器,用户可以在其中选择多个品牌、部门、饮食类型来缩小结果集。

我能想到的就是这样编码:

如果(无)...如果(品牌)...如果(部门)...如果(饮食类型)...如果(品牌和部门)...如果(品牌和饮食类型)......如果(部门和饮食类型)...如果(品牌和部门以及饮食类型)...

我知道这是错误的。因为它不是很可扩展:每次添加新过滤器时,代码分支的数量都会增加一倍。

您将如何进行整洁且可扩展的编码 - 所以如果我想添加另一个过滤器 - 例如原产国 - 我可以相对轻松地做到这一点。

我使用 C# 编写代码并使用 SQL Server 2008。

非常感谢任何帮助。

乔恩

最佳答案

您可以对产品属性使用通用方法。所有可能的过滤条件都称为属性(例如“部门#1”),按属性类型(例如“部门”)分组。

这样的模型有利也有弊。例如:当品牌只是这些属性之一时,如何保证产品完全属于一个品牌?这是模型的消极方面。最积极的方面是:无论您谈论产品的品牌、饮食类型、部门或其他什么,它们都只是您可以过滤的产品属性。无需更改过滤器代码即可轻松添加更多属性。

表属性类型

id | text1  | 'Brand'2  | 'Diet type'3  | 'Department'

Table attribute

id | id_attribute_type | text1  | 1                 | 'The Salad Makers'2  | 1                 | 'Gorgeous Food'3  | 1                 | 'Great Meals'4  | 2                 | 'No fat'5  | 2                 | 'Low carb'6  | 2                 | 'No lactose'7  | 3                 | 'Department 1'8  | 4                 | 'Department 2'

Table product_attribute

id_product | id_attribute1          | 11          | 41          | 51          | 72          | 22          | 42          | 62          | 7

Say you select all products with the word green in their title:

select * from products where upper(name) like '%GREEN%';

此外,您需要与所选产品关联的所有过滤器:

select at.id as at_id, at.text as at_text, a.id as a_id, a.text as a_text
from product_attribute pa
join attribute a on a.id = pa.id_attribute
join attribute_type at on at.id = a.id_attribute_type
where pa.id_product in (select id from products where upper(name) like '%GREEN%');

如果“绿色”产品恰好是产品 1 和 2,那么您会得到:

  • “品牌”(1)
    • “沙拉制作者”(1)
    • “美食”(2)
  • '饮食类型' (2)
    • '无脂肪' (4)
    • '低碳酸盐' (5)
    • “无乳糖”(6)
  • '部门' (3)
    • '部门 1' (7)

现在用户选择 Brand = 'The Salad Makers' 和 'Diet type' = 'No fat' 或 'No lactose'。这使得:

select * 
from products
where upper(name) like '%GREEN%'
and id in
(
select id_product
from product_attribute
group by id_product
having sum(case when id_attribute in (1) then 1 end) > 0 criteria for Brand
and sum(case when id_attribute in (4,6) then 1 end) > 0 -- criteria for Diet type
);

您只需为每个使用的属性类型(此处为 1 个品牌和 2 个饮食类型)添加一个条件行,并使用包含所选属性的 IN 子句来创建此类查询。

这样的模型可以变得更加复杂。例如,可能有一些过滤器与 OR 相关(所有品牌 x y 的产品),而其他过滤器与 AND (​​所有既甜又酸的产品 ).

好吧,你明白了。我不知道你是否觉得这适合你正在做的事情。这只是一个想法。如前所述,它有优点,但也有缺点。

您还可以决定采用混合概念(例如:品牌等主要属性保留在真实列中,而其他属性则进入属性表)。

关于database - 如何为搜索后过滤构建数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25609057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com