草庐IT

MongoDB电商产品文档设计

coder 2023-10-28 原文

我正在构建一个电子商务网站,并决定试用 MongoDB。我的目标是实现完全的灵 active ,这样到最后,我就不会受制于销售特定产品,而受到系统最初组合方式的限制。

因此,灵 active 的目标是,我必须能够根据属性创建产品。外汇。颜色、制造商、速度等。所有属性都必须是可选的。用户可以创建新的属性,有些是默认的系统属性(不可删除)。根据属性的配置,它将与“基础”产品或可配置产品分层。

  • 在目录中,我想拆分具有颜色属性的产品,以便每种颜色作为单独的产品呈现。我可以使用我当前的文档设计通过 MongoDB 实现这一目标吗?
  • 我得出的结论是,在从 MongoDB 中选择产品时,在展示之前,我必须“填满”我的文档,或者做大量的数据映射。我错了吗?
  • 考虑到一些产品有选项(颜色、尺寸)而另一些没有,那么进行库存管理的最佳和最有效的方法是什么?

如我的示例所示,我在属性下存储了普通属性,在文档选项下可以找到“必需”属性。

我的产品文档能否以某种方式改进,使事情变得更容易?我担心我在某件事上做得过头或做得不够,因为我发现我的想法因使用关系数据库而“受损”。

最好的问候

(
            [type] => Product
            [sku] => elin/4191
            [name] => Array
                (
                    [da] => Sko - Elin
                    [en] => Shoes - Elin
                )

            [url_key] => Array
                (
                    [da] => sko-elin
                    [en] => 1-744
                )

            [categories] => Array
                (
                )

            [shops] => Array
                (
                    [0] => 1
                )

            [images] => Array
                (
                    [0] => test.jpg
                    [1] => test1.jpg
                )

            [options] => Array
                (
                    [0] => Array
                        (
                            [color] => Array
                                (
                                    [da] => Sort
                                    [en] => Black
                                )

                            [size] => Array
                                (
                                    [da] => Lille
                                    [en] => Small
                                )

                            [shipping] => Array
                                (
                                    [weight] => 0
                                    [width] => 0
                                    [height] => 0
                                    [depth] => 0
                                )

                            [pricing] => Array
                                (
                                    [price] => 899
                                    [retail] => 0
                                    [cost] => 333
                                    [vat] => 25
                                    [special] => Array
                                        (
                                            [price] => 0
                                            [from] => new Date()
                                            [to] => new Date()
                                            [pct_savings] => 100
                                            [savings] => 0
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [color] => Array
                                (
                                    [da] => Sort
                                    [en] => Black
                                )

                            [size] => Array
                                (
                                    [da] => Medium
                                    [en] => Medium
                                )

                            [shipping] => Array
                                (
                                    [weight] => 0
                                    [width] => 0
                                    [height] => 0
                                    [depth] => 0
                                )

                            [pricing] => Array
                                (
                                    [price] => 899
                                    [retail] => 0
                                    [cost] => 333
                                    [vat] => 25
                                    [special] => Array
                                        (
                                            [price] => 0
                                            [from] => new Date()
                                            [to] => new Date()
                                            [pct_savings] => 100
                                            [savings] => 0
                                        )

                                )

                        )

                    [2] => Array
                        (
                            [color] => Array
                                (
                                    [da] => Orange
                                    [en] => Orange
                                )

                            [size] => Array
                                (
                                    [da] => Lille
                                    [en] => Small
                                )

                            [shipping] => Array
                                (
                                    [weight] => 0
                                    [width] => 0
                                    [height] => 0
                                    [depth] => 0
                                )

                            [pricing] => Array
                                (
                                    [price] => 899
                                    [retail] => 0
                                    [cost] => 333
                                    [vat] => 25
                                    [special] => Array
                                        (
                                            [price] => 0
                                            [from] => new Date()
                                            [to] => new Date()
                                            [pct_savings] => 100
                                            [savings] => 0
                                        )

                                )

                        )

                    [3] => Array
                        (
                            [color] => Array
                                (
                                    [da] => Orange
                                    [en] => Orange
                                )

                            [size] => Array
                                (
                                    [da] => Medium
                                    [en] => Medium
                                )

                            [shipping] => Array
                                (
                                    [weight] => 0
                                    [width] => 0
                                    [height] => 0
                                    [depth] => 0
                                )

                            [pricing] => Array
                                (
                                    [price] => 899
                                    [retail] => 0
                                    [cost] => 333
                                    [vat] => 25
                                    [special] => Array
                                        (
                                            [price] => 0
                                            [from] => new Date()
                                            [to] => new Date()
                                            [pct_savings] => 100
                                            [savings] => 0
                                        )

                                )

                        )

                )

            [attributes] => Array
                (
                    [designer] => Array
                        (
                            [name] => Array
                                (
                                    [da] => Manufacturer
                                    [en] => Manufacturer
                                )

                            [type] => text
                            [visible] => 1
                            [required] => false
                            [value] => Array
                                (
                                    [da] => FunnyShirts
                                    [en] => FunnyShirts
                                )

                        )

                )

        )

最佳答案

我认为您的设计会很好,尽管我认为没有必要将必需属性和可选属性分离到单独的子文档中。

我不懂 PHP,但要在显示时将每种颜色视为单独的产品,您可以执行以下操作:

product = db.products.findOne({sku: "..."})
for color in product.colors:
    # render the product with the color

没有必要“填满”您的文档——我假设您的意思是为每个可能的属性存储空值?您的应用程序代码应该简单地检查文档中是否存在可选值,并据此做出呈现或业务逻辑决策。 MongoDB 的优势之一是它的灵 active 。并非所有文件都必须相同。您的应用程序代码应编写为处理不包含所有可能字段的文档。

关于MongoDB电商产品文档设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9550361/

有关MongoDB电商产品文档设计的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  8. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  9. Ruby 等同于 Sphinx 文档生成器? - 2

    Ruby有一些不错的文档生成器,例如Yard、rDoc,甚至Glyph。问题是Sphinx可以做网站、PDF、epub、LaTex等。它在重组文本中完成所有这些事情。在Ruby世界中有替​​代方案吗?也许是程序的组合?如果我也能使用Markdown就更好了。 最佳答案 自1.0版以来,Sphinx有了“域”的概念,它是从Python和/或C以外的语言标记代码实体(如方法调用、对象、函数等)的方法。有一个rubydomain,所以你可以只使用Sphinx本身。您唯一会缺少的(我认为)是Sphinx使用autodoc从源代码自动创建文档

  10. ruby-on-rails - 设计通过 reset_password_token 获取用户 - 2

    我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow

随机推荐