【问题标题】:Single or multiple mysql rows? (shopping basket)单个或多个mysql行? (购物篮)
【发布时间】:2009-12-05 23:43:59
【问题描述】:

我目前正在创建一个自定义电子商务网站(在 php 中,但这与这个问题并不真正相关)。

我刚刚创建了购物篮,无法在以下 2 个选项之间做出选择:

选项 1:
篮子桌:

  • 身份证
  • 用户
  • 项目

在此选项中,我会为每个用户保留一行,所有商品和数量都存储在 items 字段中。

这种格式已经用于未登录用户的基于cookie的购物篮中,因此解析items字段没有问题。

选项 2:
Basket_items 表:

  • 身份证
  • 用户
  • 项目
  • 数量

在这个选项中,我会在购物篮中的每一项都保留一行。

选项 3:
提出一个更好的主意。

结论

这两个选项对我来说同样容易实施,所以问题来了,更新购物篮更有效/更方便。

谢谢你的任何回答,尼科

【问题讨论】:

    标签: sql mysql e-commerce


    【解决方案1】:

    选项 2 是要走的路。将所有项目和数量存储在项目字段(选项 1)中意味着您违背了 MySQL 的关系性质。您必须定义一种格式并使用选项 1 解析它,使用选项 2 编写的附加代码是您没有编写的。此外,使用选项 2,您将能够更轻松地做其他事情,例如计算总数、运费等,以及报告已售商品数量(只是一个简单的查询)。

    当然,如果我正在写这篇文章,我也会问自己是否有可用的库来执行此操作 - 为什么要重新发明像购物车这样的常见功能。我不是来自 PHP 世界,所以我不知道选项是什么,但我相信一定有一些你可以重用的东西。所以最终,我鼓励你选择选项 3 - 如果你避免它,不要自己实现它:-)

    【讨论】:

    • 好点,您的选项 3 当然是一个非常明智的想法,但我是一个奇怪的人,我决定我宁愿编写自己的系统也不愿学习如何自定义我不知道的代码'不明白。我想我可能会选择选项 2,尽管我不需要编写代码来解析选项 1,因为这已经写好了 - 我用它来为未登录的用户将篮子项目存储在 cookie 中。那里据我所知,基于 cookie 的系统没有其他选择。
    • 你认为有一个数据模型库?!
    • OMG - 不是用于数据模型的库,而是允许您将此类功能集成到另一个系统中的模块,包括数据模型、业务逻辑和一些 UI。
    【解决方案2】:

    使用选项 2 - 您实际上无法支持使用选项 1 对购物车进行更改或从中生成报告。

    【讨论】:

      【解决方案3】:

      选项 3

      至少您需要一个篮子表和一个 basket_items 表。购物车天生就变得臃肿,您很快就会意识到您将需要比预期更多的关系表。以这种方式分解表格为每个用户的购物篮与他们的项目提供了一对多的关系。

      这将让您在未来做一些事情,例如将促销代码应用于每个用户的购物篮。

      篮子

      • 身份证
      • user_id

      basket_items

      • 身份证
      • basket_id
      • item_id
      • 数量

      【讨论】:

      • 这不是必需的。假设用户没有多个购物篮。
      • @Gary - 我自己从头开始创建了一个购物车并查看了许多开源系统的源代码,我可以向您保证,无论您多么简单,这对于将来证明您的购物车来说都是不错的选择创造它。请忽略您的 -1,因为它没有经过深思熟虑。
      • 对我来说似乎没有必要 - 增加了系统的复杂性。此外,如果将来每个用户需要多个购物篮,将其中一个系统转换为该系统并不难。
      • +1 让您从 -1 中恢复 :-)。不过,我建议您在需要多个购物车时始终进行重构。
      • @Gary:如果您愿意,可以撤销您的反对意见,但考虑到随着时间的推移,购买历史会有多个“篮子”。篮子只是订单的同义词。
      【解决方案4】:

      选项 1 将要求您序列化 items 列中的数据,由于复杂性和性能原因,这通常是不受欢迎的。

      您正在使用数据库的链接功能,所以让我们使用它们。您的 cart_items 表应该运行得非常好。这样,每个购物车都可以指向一个用户,并且购物车中的所有商品都可以指向购物车。

      【讨论】:

        【解决方案5】:

        选项 2。这是最好的选项,并提供了良好的数据规范化。它将为未来可能的高级选择和用户篮过滤让路。

        【讨论】:

          【解决方案6】:

          选项 2 是首选。

          “item_id”可以是存储所有项目的表(存储表)的 id,并且该项目的完整描述和其他信息可用。但是我会在这个购物篮中为每件商品添加一个价格标签,而且通常还可以将用户会话 id /md5 哈希添加到这个购物篮中。因此 PHP 创建此类表的 SQL 查询字符串可能类似于:

             $sql="CREATE TABLE ".$table_prefix."Basket (
             id int(11) NOT NULL auto_increment,
             sid varchar(50) default NULL,
             item_id int(10) default NULL,
             quantity int(10) default 1,
             price varchar(10) default NULL,
             PRIMARY KEY(id)
          ) $collate_charset;";
          

          $collat​​e_charset:类似于$collate_charset="DEFAULT CHARACTER SET utf8";

          $table_prefix:为表添加前缀通常很有用,例如$table_prefix="myshop_";

          使用此类表,您可以从 SQL 函数(如“Sum”)中受益,无需太多代码即可快速获取用户或所有用户的小计(“Select Sum(price * quantity) WHERE sid = '1234'”)。 如果这个篮子也是“客人”的,你需要另一个表来存储 session-id 和创建日期,这样你就可以定期清理篮子中未使用的条目。

          【讨论】:

            猜你喜欢
            • 2014-02-27
            • 1970-01-01
            • 2019-05-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多