微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 保存,组织和查询产品,选项/标签和类别

首先,让我明确表示我不会要求任何代码;我只是想要一些关于如何实现我要问的内容的一般性想法/指导/意见.

我开始构建一个在线电子商务系统(Yii2 MongoDB,所以,PHP Nosql),有两个必要条件,我不完全确定如何实现,而不会在我的代码数据库中造成巨大的混乱.

两个必需品都是相关的,所以我将它们解释为一个.

与任何其他严肃的电子商务一样,它也有类别.而且,与任何其他严肃的电子商务一样,每种产品都有标签或选项.让我再解释一下我称之为标签/选项的内容.

这些是用户在购买产品时可以选择的选项,例如颜色或尺寸,材料等.

>分类

将有多个一般类别以及其他子类别.例如,电子产品可以是一般类别,子类别可以是计算机和智能电视.然后,主板和RAM可以是计算机的子类别.

这本身可以很容易地存储在数据库中,但是这里出现问题:

>每个产品在列出其所属的任何类别或上层类别时都应显示.这意味着,如果我(作为最终用户)浏览计算机类别中的所有项目,我应该看到NVIDIA GTX670属于子类别计算机类别的图形卡.

我可以通过以下方式保存每个产品:

{
    _id: asdasfwetrw34tw34t245y45y,
    name: "NVIDIA GTX670",
    price: 99.50,
    ...
    ...
    categories: [
        "Electronics", //<-- just the ID of that group
        "Computers", //<-- just the ID of that group
        "Graphic cards" //<-- just the ID of that group
    ]
}

但:

>我不确定检索某个类别的所有项目(当然还有所有子类别的项目)的查询速度有多快.
>我不确定该方法有什么其他缺点,所以,请随意推荐任何替代架构来存储它.

2.标签/选项

这是真正头痛的地方.

每个选项可以属于0个或更多类别和子类别,因此女性时尚类别可以有选项大小和颜色,但类别太阳镜(女性时尚的子类别)可能只有颜色,甚至是另一组选项,完全不同于女人时尚.

此外,每个选项内的值(颜色选项中的红色,绿色,蓝色)可以以随机类别显示.因此,女性时尚会有像StrawBerry Red和Tangerine这样的颜色,而Cars则会有碳和黑色的金属色.

此外,还有几种类型的选择:

>完全静态(如大小,可能只有S或M,但从不两者.在任何情况下,管理员都无法编写自定义大小,如小型;他可以只选择它是什么已经在数据库中).
>可以组合在一起的静态(如颜色,可以是红色或绿色,或管理员选择的颜色组合).
>自由输入(如尺寸或重量,理想情况下,是输入字段和下拉值以加入.例如[10] |(mg || kg |吨)或[20](cm | m | km |英里)).

我可以像这样保存每个选项:

{
    option: "Color",
    type: "Static with combinations"
    values: [
        {
            value: "Red",
            categories: [
                "Sunglasses"
            ]
        },
        {
            value: "Green",
            categories: [
                "Sunglasses",
                "T-Shirts"
            ]
        },
        {
            value: "Black Metallic",
            categories: [
                "Cars"
            ]
        }
    ],
    categories: [
        "Woman fashion", //<-- only the ID of this group
        "Cars" //<-- only the ID of this group
    ]
}

但是我担心单个选项有多大,当有30个类别时,该选项的每个值都设置为随机类别.
我也觉得它看起来不够干净,但也许这只是我.

无论如何,与前一点一样,请随时提出任何可以提出的建议,我将非常感谢您给我的任何反馈.

解决方法:

我也在运营一个电子商务网站.以下是我如何实现您提到的功能的建议.希望能帮助到你.

>分类

我把它们整理成一个扁平的结构,在你的情况下它将是:

    {_id: 1, name: "Electronics", parentId: 0, idpath: "/0/1/" ...}
    {_id: 2, name: "Computers", parentId: 1, idpath: "/0/1/2/", ...}
    {_id: 3, name: "Graphic Cards", parentId: 2, idpath: "/0/1/2/3/", ...}

而产品现在只需要在叶子类别中.在你的情况下:

    {
        _id: asdasfwetrw34tw34t245y45y,
        name: "NVIDIA GTX670",
        price: 99.50,
        ...
        ...
        categoryIds: [3]
    }

当然,产品可以分为多个类别,因此categoryIds仍然是一个数组.
这是棘手的部分.列出电子类别时,您可以通过以下方式找到其所有子类别:

    db.categories.find({idpath: /^\/0\/1/})

idpath索引在这里工作,所以它会很快.当您找到所有子类别时,您可以轻松找到其中的所有产品(在产品集合的categoryIds上构建索引).

或者,您可以将所有类别读入内存并使用key-> categoryId,value-> [所有子类别]构建哈希表.您的类别通常不会经常更改,您将不会有很多类别.因此它会好起来的.

>标签/选项

首先,我认为您的类别存在问题.女性时尚是通用的,你应该把你的产品放到更具体的东西,选择也应该在那里.例如,可能存在具有尺寸和尺寸的类别涂层.颜色,女性时尚以外.虽然女性时尚可能仍有颜色选择,因为它是所有子类别的共同特征.
如果您考虑一下,为什么所有子类别都组织在一个父类别中?因为他们有共同点.这个共同部分应该是父类别的共同选项.也就是说,所有父类别和子类别之间应该存在继承.例如:

women fashion: color
|-coat: size
|-sun glasses: shape

然后外套最终会有2种颜色选择.尺寸.太阳眼镜:color&形状.当您观看女性时尚时,只有一种颜色选择.它也过滤子类别,因为它们继承了女性时尚.
至于颜色的价值,我的想法只是使用标准颜色草莓红实际上是红色,橘子实际上是橙色.过滤产品时,您并不希望它们出现.否则会有太多的选择,绝对不利于用户体验.
但是,除了类别中的颜色选项,我的网站还有一些称为可自定义的选项.这些选项仅在产品上定义.当您查看类别时,它们永远不会出现在这里你可以吃草莓红&柑橘.在我看来,这些不是产品的“天然”特性.它们仅用于使用户在查看产品时感觉更舒适.因此你也可以选择像橘子这样的图形等.
选项还有一件事.您可能想要标记哪些选项应该用于过滤产品.例如,颜色肯定是一个.虽然维度可能不是.

关于选项类型.如果它对你来说足够了你的.我有更多类型,如数字,字符串,单选,多选.我还计划执行该股.例如,单位的棘手部分就是这样

1GB = 1024MB = 1024*1024B

因此,当您获得1GB和1TB的硬盘时,您可能希望在过滤产品之前进行转换.这不是我将回到你的问题的主题.

请注意,虽然不同类别的选项具有相同的名称.他们不太可能是同一件事.外套和家具的材料是两件不同的东西.所以我倾向于为不同的类别定义不同的选项.因此,玩具可能有颜色,女性时尚也有颜色.这与上面提到的继承没有冲突,因为从某种程度上说,子类别开始共享相同的选项.这与您组织类别结构的方式完全相关.如果你想改变类别结构或移动产品一段时间,那将是痛苦的.因此,在定义类别时要小心.

这就是我想到的一切.我担心我不是母语为英语的人,因此你可能会发现我的答案有些难以理解.请随时告诉我.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐