【问题标题】:Product database schema redesign产品数据库架构重新设计
【发布时间】:2012-10-19 00:17:37
【问题描述】:

我设计我的商店是为了销售定制加工零件。目前我的产品实际上是一个产品包(选项)。架构如下所示:

types
    id, name

products
    id, type_id, name

optiontypes
    id, name

options
    id, type_id, name

product_option
    id, product_id, option_id

carts
    id, session, product_id

cart_option
    id, cart_id, option_id

orders
    id, name

order_option
    id, order_id, option_id

我的问题是,我有回头客,他们已经购买了包裹,现在想购买单件进行更换。我正在考虑将 optiontypes 合并到类型中,并将 options 合并到产品中,但是我如何确定什么是打包产品或单个产品?

编辑

在阅读了关于 BOM - 来自 pst 的模块化材料清单的评论后,这是我想要做的:

------------------------------------

ORDER: 1001

package1
    module1
        component1
        component2
    module2
        component3
        component4
        component5

------------------------------------

ORDER: 1002

component1
component5

------------------------------------

ORDER: 1003

package2
    module1
        component1
    module2
        component3

------------------------------------

我将如何寻找一个兼顾两者的解决方案?

【问题讨论】:

  • 你能不能只有一个包含单个产品的包?
  • 可能值得研究 BOM - 然后可以将 BOM 的任何“级别”(可出售)添加到购物车。此外,这读起来非常令人困惑 - 尽量避免重载术语,除非有必要的一致性/使用理由。
  • 我阅读了一些关于 BOM 的内容并找到了模块化 BOM,您能检查我的编辑吗?
  • 这里没有足够的信息来清楚地理解 module 的含义。例如,按顺序 1001 module1 包含 component1component2 - 但是按顺序 1003 module1 仅包含 组件1module2 同样不一致。如果一个模块没有始终包含相同的组件,那它不就是一个不同的包吗?

标签: mysql database database-design


【解决方案1】:

好的,所以一个包含一个或多个部分。客户可以为一个或多个包裹和/或一个或多个零件订单。由于我不知道一个选项可能是什么,我或多或少地将它与 *part_type* 合并,所以也许你有一个 Aluminum 零件类型以及一个 Pre-Drilled Aluminum 零件类型。

您的订单会跟踪订购了哪些包裹以及订购了哪些单独的部件。如果我对您的理解正确,作为包装组件出售的零件或单独出售的零件之间没有物理区别 - 您只需要能够跟踪它是如何购买的。像这样设置可以让您跟踪它。

packages
    id              unsigned int(P)
    description     text // This package contains all the parts you need to build SuperMegaWidget!

packages_parts
    id              unsigned int(P)
    package_id      unsigned int(F packages.id)
    part_id         unsigned int(F parts.id)

part_types
    id              unsigned int(P)
    name            varchar(50) // Aluminum, Brass, whatever, etc.

parts
    id              unsigned int(P)
    part_type_id    unsigned int(F part_types.id)
    name            varchar(50) // Widget A, Widget B, etc.

orders
    id              unsigned int(P)
    ... lots of other information in here

orders_packages
    id              unsigned int(P)
    order_id        unsigned int(F orders.id)
    package_id      unsigned int(F packages.id)

orders_parts
    id              unsigned int(P)
    order_id        unsigned int(F order.id)
    part_id         unsigned int(F parts.id)

【讨论】: