Database design 如何在网上商店保存订购物品的副本?

Database design 如何在网上商店保存订购物品的副本?,database-design,e-commerce,Database Design,E Commerce,人们在网上商店买东西 我接受他们的命令并将其保存到数据库中。对于每个订购的项目,我需要数量和有关项目的信息。至少,我需要保存每个商品的当前价格和名称,但我更愿意保存所有内容 问题来了保存每个订购商品的所有信息的最佳方式是什么? 复制到与产品表列相同的单独表中 在同一表格中复制产品,标记为不可编辑、不可查看的副本 某种类型的写时复制模式,在“实时”产品信息实际更改之前可以节省一些空间 为简单起见,我们假设所有产品信息都保存在一个表中。通常,ecom商店有以下表: accounts product

人们在网上商店买东西

我接受他们的命令并将其保存到数据库中。对于每个订购的项目,我需要数量和有关项目的信息。至少,我需要保存每个商品的当前价格和名称,但我更愿意保存所有内容

问题来了保存每个订购商品的所有信息的最佳方式是什么?

  • 复制到与产品表列相同的单独表中
  • 在同一表格中复制产品,标记为不可编辑、不可查看的副本
  • 某种类型的写时复制模式,在“实时”产品信息实际更改之前可以节省一些空间

  • 为简单起见,我们假设所有产品信息都保存在一个表中。

    通常,ecom商店有以下表:

    accounts
    products
    order
    orderdetails
    
    这通常还有很多。但这是基础

    Account = the user shopping in the store
    Product = the product description, price, etc.
    Order = the high level order details such as purchase date, shipping/billing address
    OrderDetails = the low level order details such as price at time of purchase, quantity, etc.
    

    看看DashCommerce之类的开源购物车,了解如何设置工作购物车系统。我喜欢这个特别的一个,因为它实现了许多必要的和更复杂的电子商务

    如果你店里的产品经常更换,那么听起来你需要的是产品版本历史记录

    基本上,您应该尝试识别经常更改的店铺商品的所有属性/字段,并将它们放入一个单独的
    product\u properties
    (或其他)表中,带有这些属性的特定版本的时间戳。也许您的所有属性都会一直更改,在这种情况下,您可能只需要一张表就可以了。在任何情况下,您都可以假定最新的时间戳是产品的最新版本

    当店主更新产品时,您可以在
    product\u properties
    中使用所有更改的属性创建一个新记录,并更新主产品表记录以指向该新记录(或者只需在显示时拉出最新的时间戳)

    当有人进行购买时,您会在购买表中记录产品id和产品的历史/版本id


    使用这种类型的历史记录设置,您已经规范化了产品数据,因此它不会与每个购买记录一起反复存储,您仍然可以获得每次购买的具体细节。

    在存储“购买时信息”时,这是一个好主意仅链接到sku,但实际复制产品表的所有信息(包括定价、说明、sku等)。万一将来这些产品说明和价格发生变化,你的订单不会中断

    我通常按产品ID链接产品,然后将所有产品数据复制到订单详细信息中

    同样,您也希望在帐户和订单之间执行相同的操作。将订单链接到帐户ID,但存储所有实际客户信息(姓名、地址等),以便在以后更改时不会引起争议

    您不必担心该sku的安装版本——无论当时是什么,它都是,这就是账单上的内容。这样,客户过去的所有历史记录都将保持有效

    如果您想要另一个层,您可能希望实现对account和product表的跟踪更改,以便了解更改的内容


    以上是我在SAP B1等系统中看到的,设计模式很有意义。。为了存储一些额外的信息,您可以在其他地方消除复杂性。

    Jas Panesar关于SKU的想法非常好。但是,如果您正在寻找一种更简单的方法,则可以将信息存储在数组中,对其进行序列化,然后将序列化结果存储在数据库中的单个字段中


    虽然这没有解决方案那么强大,但它确实让您能够快速、轻松地获取信息,而无需重新设计整个数据库结构。

    “例如购买时的价格”——这正是我的问题所在。如果我想像购买产品时那样存储每个购买产品的所有信息(快照),该怎么办?我以前建立过电子商务网站,所以我知道一些选择,但我问这个问题是因为我想知道是否有一个普遍首选的解决方案。如果可以的话,通常最好避免数据库中的任何序列化数据。它成为一个维护难题,并阻止了对序列化数据进行大量有用的SQL查询。