【问题标题】:building a database for my site为我的网站建立数据库
【发布时间】:2023-03-24 13:05:02
【问题描述】:

我需要帮助为我的在线定制西装商店设计数据库。到目前为止,我已经为产品、订单和我的用户/客户创建了表格。我想我需要添加一些表格来在客户进行选择和定制时为他们管理我的购物车。在这一点上,我对如何进行有点困惑。我的购物车是否需要保存我的订单表最终将保存的所有信息?从附图可以看出,订单有订单项目,订单项目有订单项目选项。这样,我可以提取客户想要的每个订单项目,以及每个特定订单附带的所有自定义项。这是否需要首先在我的购物车中完成,这意味着我基本上必须复制数据库订单部分中的所有表,还是有更好的方法?此外,为了稳健地运行像 www.indochino.com 这样的网站,我的数据库应用程序还缺少什么?

感谢所有帮助...

【问题讨论】:

    标签: database-design normalization


    【解决方案1】:

    如果您在订单表上放置一个“in_cart bit”列,它会起作用吗?这样,您可以使用相同的表,但在订单尚未最终确定的情况下将 in_cart 设置为 1。

    【讨论】:

      【解决方案2】:

      您应该将order 表更改为shopping_cart 表,并从中删除所有送货地址信息。

      然后创建一个单独的order 表,其中包含一个指向关联购物车的shopping_cart_id。此order 表应包含已发布订单的所有必要信息,例如送货地址、行项目总金额、税额、订单总金额、发布日期时间等。

      我不认为状态字段是正确的方法,因为购物车不是订单,很多订单字段不适用于购物车。这些字段不应采用空值,因为它们是完成订单所必需的。在编写有关此数据的报告时,根据状态字段存储完全不同内容的表格是一种负担。

      【讨论】:

      • 这是一个视角问题。一种看待它的方式是,购物车代表尚未完成的订单。它们不是完全不同的东西。他们持有许多相同的信息。实际上只有订单状态不同。而且我认为您关于订单字段不应采用空值的断言​​是错误的。订单表上有空/空字段没有任何问题。如果您想报告已完成的订单,只需将查询范围限定为 where status = 'complete' 或其他任何内容。
      • @Josh Deeden - 您的方法要么 (1) 使数据完整性约束的创建复杂化,要么 (2) 避免使用适当的数据完整性约束。我知道有一类开发人员看不到 DB 约束的价值,但我的经验表明他们在构建防弹系统方面非常有价值。最小化“不适用”的空值和魔法变形表是设计良好约束系统的两种方式。
      • 我想如果你喜欢重复代码和数据,那么你的方法可能是正确的。然而,如果你喜欢 DRYness 并且让事情变得没有必要变得更复杂,那么我认为我的方法会赢得胜利。以引入重复为代价来最小化不适用的空值似乎有点过分,而且相当不切实际。
      • 将约束构建到数据结构中,而不是将它们附加到不模拟现实世界事实的结构上,从而减少而不是扩展复杂性。尽管这似乎是多余的,但验证系统中所有层边界的数据是一种很好的做法,可以最大限度地减少错误并创建更好的关注点分离。
      • @Guided33 - 我的解决方案不涉及任何数据重复(这是数据库设计中最大的罪过!)。当完整性检查出现在业务逻辑层和数据库层时,就会发生代码重复。然而,这并不是一个很大的问题,因为两层以非常不同的方式处理数据,所以检查实际上会非常不同。数据库约束也很重要,因为它可以防止来自应用程序之外的其他来源的错误,并且因为实时系统中的数据错误比编程更难纠正......
      【解决方案3】:

      假设您的购物车是一个单独的表,它应该有 orderid 和 userid 作为外键。

      【讨论】:

        【解决方案4】:

        我认为您不需要单独的桌子来放置购物车。我只会使用现有的 order/order_item 表来保存购物车信息,然后在订单上添加一个状态字段,其中包含“不完整”、“完成”、“已发货”等值。任何不完整的订单都是呈现为购物车。状态机将是管理订单生命周期的好选择,恕我直言。

        【讨论】:

        • 好主意,如果我要这样做,我需要为状态值创建一个单独的表吗?
        • @Guided33 - 通过这种设计,状态字段通常位于订单表上。或者,可以隐式使用 null 的 post_date 来指示不完整的订单。 (shipping_date 为 null 表示订单未完成,等等。)这将消除此设计中固有的一些冗余。
        猜你喜欢
        • 1970-01-01
        • 2016-04-23
        • 2016-02-01
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        相关资源
        最近更新 更多