【发布时间】:2020-08-24 10:45:11
【问题描述】:
我正在创建一个带有 node/express 支持的 Angular 应用程序(计算机在线商店)。我有一个产品页面来显示我的数据库中的所有产品。一个产品有这个模型(打字稿):
interface Product {
name: string
properties: {name: string, value: string | number}[]
}
我在页面中有一个部分,您可以在其中按属性过滤产品。例如,用户可以过滤所有具有 4 核或 8 核的 CPU。现在这是这样实现的:
在 Angular 应用程序中,我查询所请求类别的 所有产品, 遍历所有这些,收集它们的属性和所有可能的值并像这样过滤......
const products = [
{
name: 'intel cpu 1',
properties: [
{name: 'cores', value: 8},
{name: 'clock speed', value: 2.6}
]
},
{
name: 'intel cpu 2',
properties: [
{name: 'cores', value: 4},
{name: 'clock speed', value: 1.2}
]
}
]
collectPropertiesFromProducts(products)
// RESULT:
[
{property: 'cores', possibleValues: [4,8]},
{property: 'clock speed', possibleValues: [1.2,2.6]}
]
现在它工作得很好,我可以通过结果轻松过滤产品,而且它都是动态的(我只需向产品添加一个属性就可以了)。
问题在于它的扩展性非常糟糕,因为:
- 我必须查询所有产品才能知道它们的属性
- 更多产品/属性 = 更多 CPU 时间 = 阻塞主线程
我的问题是我怎样才能做得更好?我有一个节点服务器,所以将所有逻辑移到那里它非常没用,我也可以将“属性收集”功能移动到工作线程,但同样,我必须查询所有产品......
【问题讨论】:
-
为什么将所有逻辑移到后端“毫无用处”?我认为这是唯一有效的解决方案。根据您的数据库的结构,您可能会发现在各种可过滤属性上对其进行索引很有用。
标签: javascript node.js angular mongodb