在 Node 中为电子商务网站动态创建 Mongoose Schema
Create Mongoose Schema Dynamically for e-commerce website in Node
我想问一个关于电子商务数据库设计在可扩展性和灵活性方面的可能解决方案的问题。
我们将在后端使用 MongoDB 和 Node。
我附上了一张图片,供您查看我们目前拥有的内容。我们目前有一个 Products table 可用于将产品添加到系统中。有趣的是,我们希望能够将具有不同属性的不同类型的产品添加到系统中。
例如,在管理员管理页面中,我们可以select一个衣服项目,我们应该在其中填写一个表格,其中包含等字段高度,长度,尺寸 ...等。问题是我们如何在数据库设计中对这种结构进行建模?
我们想的是创建 table,例如 ClothesProduct 等等,并分别连接 Products table 到其中之一。但是对于不同的产品类型,我们可以有 100 个不同的 table。我们想从管理员管理中动态添加产品类型。这在猫鼬中可能吗?因为在 Products table 中创建所有可能的字段效率不高,从长远来看这会给我们带来沉重打击。
Database design snippet
也许我们应该为每个独特的产品类型创建单独的 tables,并且从前端,我们会 select 其中之一来显示正确的形式?
能否分享一下您的想法?
谢谢!
我们有一个 mongoose 后端,自大约 3 年前它成立以来我一直在努力。这是我的一些教训:
Mongodb 是 noSQL:通过 ID 链接所有这些对象,查找“商店 A”的所有产品变得非常痛苦:您必须进行多次查询才能获得特定商店的产品列表(商店 -> 品牌类别 -> 子类别 -> 产品)。考虑将某些对象嵌套在其他对象中(例如,类别中的子类别,因为它们在语义上是相同的)。这将节省大量的加载时间。
动态创建的产品字段:我们构建了一个(现在)大模块,允许用户创建自己的数据库键和值,并将它们分配给不同的对象。本质上,它看起来像这样:
SpecialFieldModel: new Schema({
...,
key: String,
value: String,
...,
})
通过这种方式,您的用户可以“制作自己的产品”
产品数量:Mongodb 查询可以处理巨大的数据负载,所以我不会太担心某些表有数千个对象。但是,如果您想要关于 所有 数据的大型报告,您将需要确保您的 ID 位于正确的位置。然后,您可以使用 Aggregation framework 构建可能必须将数据库中的多个收集器绑定在一起的大型查询,并以高效的方式获取数据。
不要在两个方向上引用 ID,除非您不知道自己在做什么:在子类别中保存对类别 ID 的引用,反之亦然,这非常令人困惑。如果要切换子类别,必须更新哪个字段?非此即彼?或两者?即使进行了强有力的测试,对于新开发人员来说,理解“查询 运行 的方向”(如果您正在构建一个将来可能需要扩展的产品)也可能会非常混乱。我们都做了,这导致了一些问题。但是,我发现那些保存对上层对象(而不是下层对象)的引用的模块始终更愉快且易于使用。
created/updatedAt:考虑将这些字段添加到每个模型和架构中。这将有助于您将来能够构建的调试、可扩展性和通用功能,否则这些功能可能是不可能的。 (ProductSchema.set('timestamps', true);
)
请对我的建议持保留态度,因为我们的大部分模块都不是我设计的。但这些是我认为继续处理我们的应用程序的事情。
我想问一个关于电子商务数据库设计在可扩展性和灵活性方面的可能解决方案的问题。
我们将在后端使用 MongoDB 和 Node。
我附上了一张图片,供您查看我们目前拥有的内容。我们目前有一个 Products table 可用于将产品添加到系统中。有趣的是,我们希望能够将具有不同属性的不同类型的产品添加到系统中。
例如,在管理员管理页面中,我们可以select一个衣服项目,我们应该在其中填写一个表格,其中包含等字段高度,长度,尺寸 ...等。问题是我们如何在数据库设计中对这种结构进行建模?
我们想的是创建 table,例如 ClothesProduct 等等,并分别连接 Products table 到其中之一。但是对于不同的产品类型,我们可以有 100 个不同的 table。我们想从管理员管理中动态添加产品类型。这在猫鼬中可能吗?因为在 Products table 中创建所有可能的字段效率不高,从长远来看这会给我们带来沉重打击。
Database design snippet
也许我们应该为每个独特的产品类型创建单独的 tables,并且从前端,我们会 select 其中之一来显示正确的形式?
能否分享一下您的想法?
谢谢!
我们有一个 mongoose 后端,自大约 3 年前它成立以来我一直在努力。这是我的一些教训:
Mongodb 是 noSQL:通过 ID 链接所有这些对象,查找“商店 A”的所有产品变得非常痛苦:您必须进行多次查询才能获得特定商店的产品列表(商店 -> 品牌类别 -> 子类别 -> 产品)。考虑将某些对象嵌套在其他对象中(例如,类别中的子类别,因为它们在语义上是相同的)。这将节省大量的加载时间。
动态创建的产品字段:我们构建了一个(现在)大模块,允许用户创建自己的数据库键和值,并将它们分配给不同的对象。本质上,它看起来像这样:
SpecialFieldModel: new Schema({
...,
key: String,
value: String,
...,
})
通过这种方式,您的用户可以“制作自己的产品”
产品数量:Mongodb 查询可以处理巨大的数据负载,所以我不会太担心某些表有数千个对象。但是,如果您想要关于 所有 数据的大型报告,您将需要确保您的 ID 位于正确的位置。然后,您可以使用 Aggregation framework 构建可能必须将数据库中的多个收集器绑定在一起的大型查询,并以高效的方式获取数据。
不要在两个方向上引用 ID,除非您不知道自己在做什么:在子类别中保存对类别 ID 的引用,反之亦然,这非常令人困惑。如果要切换子类别,必须更新哪个字段?非此即彼?或两者?即使进行了强有力的测试,对于新开发人员来说,理解“查询 运行 的方向”(如果您正在构建一个将来可能需要扩展的产品)也可能会非常混乱。我们都做了,这导致了一些问题。但是,我发现那些保存对上层对象(而不是下层对象)的引用的模块始终更愉快且易于使用。
created/updatedAt:考虑将这些字段添加到每个模型和架构中。这将有助于您将来能够构建的调试、可扩展性和通用功能,否则这些功能可能是不可能的。 (
ProductSchema.set('timestamps', true);
)
请对我的建议持保留态度,因为我们的大部分模块都不是我设计的。但这些是我认为继续处理我们的应用程序的事情。