gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:12:22 25 4
gpt4 key购买 nike

首先,让我明确一点,我不要求任何代码;我只是想要一些关于如何实现我将要提出的问题的一般性想法/指导/意见。

我开始构建一个在线电子商务系统(Yii2 + MongoDB,所以,PHP + NoSQL),并且有两个先决条件我不完全确定如何实现而不在我的代码和数据库。

这两个先决条件是相关的,所以我将把它们解释为一个。

与任何其他严肃的电子商务一样,它也有类别。而且,与任何其他严肃的电子商务一样,每个产品都会有 tagsoptions .让我进一步解释一下我所说的 tags/options .

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

  • 分类

  • 会有多个 general类别以及其他子类别。例如, Electronics可以是一般类别,子类别是 ComputersSmart TVs .然后, MotherboardsRAM可以是 Computers 的子类别.

    这本身可以很容易地存储在数据库中,但问题就在这里:
  • 每个产品在列出它所属的任何类别或上层类别时都应该出现。这意味着如果我(作为最终用户)浏览 Computers 中的所有项目类别,我应该看到 NVIDIA GTX670属于子类别Graphic cards类别 Computers .

  • 我可以通过以下方式保存每个产品:
    {
    _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 个或多个类别和子类别,因此类别 Woman fashion可以有选项 sizecolor , 但类别 Sunglasses ( Woman fashion 的子类别)只能有 color ,甚至是另一组选项,与 Woman fashion 完全不同.

    此外,每个选项中的值( redgreenbluecolor 选项中)可以出现在随机类别中。所以 Woman fashion会有类似 Strawberry Red 的颜色和 Tangerine , 而 Cars会有 CarbonBlack metallic .

    此外,将有几种类型的选择:
  • 完全静态(如 size ,可能只有 SM ,但不能同时是两者。无论如何,管理员将无法编写自定义大小,如 Kind of small ;他将能够只需选择它已经在数据库中的内容)。
  • 可以组合在一起的静态(如 colors ,可以是 redgreen ,或者管理员选择的颜色组合)。
  • 自由输入(如 dimensionsweight ,理想情况下,这将是要加入的输入字段和下拉值。例如 [10] | | (mg||kg|tons)[20] (cm|m|km|miles) )。

  • 我可以像这样保存每个选项:
    {
    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仍然是一个数组。
    这是棘手的部分。当您列出 Electronics类别,您可以通过以下方式找到其所有子类别:
        db.categories.find({idPath: /^\/0\/1/})
    idPath索引在这里工作,所以它会很快。当您找到所有子类别时,您可以轻松找到其中的所有产品(在 categoryIds 集合的 Product 上建立索引)。

    或者,您可以将所有类别读入内存并使用 key->categoryId, value->[all the subcategories] 构建哈希表。您的类别通常不会经常更改,并且您不会有很多类别。这样就没事了。
  • 标签/选项

  • 首先,我认为您的类别有问题。 Women fashion是通用的,你应该把你的产品放在更具体的东西上,选项也应该在那里。例如,可能有一个类别 coat其中有 size & color , 除了 women fashion .虽然可能还有 color women fashion 中的选项因为它是所有子类别的共同特征。
    如果您考虑一下,为什么所有子类别都组织在一个父类别中?因为他们有共同点。该公共(public)部分应该是父类别的公共(public)选项。也就是说,所有的父类和子类之间应该有继承关系。例如:

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



    然后 coat最终会有 2 个选项 color & size . sun glasses : color & shape .当您查看时 women fashion ,只有 1 个选项 color .它也过滤子类别,因为它们继承自 women fashion .
    至于颜色的值,我的想法是只使用标准颜色 Strawberry Red实际上是 red , Tangerine实际上是 orange .当您过滤产品时,您真的不希望它们出现。否则选项太多,绝对不利于用户体验。
    然而,除了 color从类别中选择,我的网站也有一个叫做 customizable options 的东西.这些选项仅在产品上定义。当您查看类别时,它们永远不会出现。在这里您可以拥有 Strawberry Red & Tangerine .在我看来,这些不是产品的“天然”特性。它们仅用于使用户在查看产品时感觉更舒适。因此,您也可以选择此类选项,例如 Tangerine with figure等等。
    关于选项的另一件事。您可能想要标记哪些选项应该用于过滤产品。例如 color绝对是其中之一。虽然 dimension也许不吧。

    关于选项类型。如果它对你来说足够了,你的就可以了。我有更多类型,例如 Number , String , Single Choice , Multiple Choices .我还计划实现 Unit . Unit的棘手部分是例如
    1GB = 1024MB = 1024*1024B

    所以当你拿到1GB和1TB的硬盘时,你可能要在过滤产品之前做一个转换。这是题外话,我会回到你的问题。

    请注意,虽然不同类别的选项具有相同的名称。它们不太可能是同一回事。 MaterialCoatFurniture是2种不同的东西。所以我倾向于为不同的类别定义不同的选项。因此可能有 colortoys , 和 colorwomen fashion .这与上面提到的继承并不冲突,因为从某个层面来看,子类别开始共享相同的选项。这与您如何组织类别结构完全相关。如果你想改变品类结构或移动产品一段时间,那将是痛苦的。所以在定义类别时要小心。

    这就是我脑海中浮现的全部内容。恐怕我的母语不是英语,因此您可能会发现我的答案的某些部分难以理解。随时让我知道。

    关于php - 保存、组织和查询产品、选项/标签和类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28269467/

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