SQL表设计:我应该用订单存储地址还是在单独的表中?

KSS*_*KSS 6 sql database-design

我正在忙着创建一个基本的电子商务网站,并想知道以下两个选项中有哪些关于我存储计费和递送地址的方式.我对任何其他建议持开放态度.

我可以在订单表中包含帐单邮寄地址和送货地址:

order
-------
billing_name
billing_address
billing_state
shipping_name
shipping_address
shipping_state
Run Code Online (Sandbox Code Playgroud)

否则我可以创建另一个只存储订单地址的表:

order
-------
billing_address_id
shipping_address_id

order_address
-------
address_id
name
address
state
Run Code Online (Sandbox Code Playgroud)

Cad*_*oux 8

我通常会选择第二个.这将让您为不同类型的客户提供许多不同的地址.但我通常会首先在客户层面解决这个问题,然后解决订单和发票.

但是,您可能需要解决订单工作流程/业务规则的性质.

订单完成后,是一份文件(如发票)吗?如果是这样,那么地址应该在那时被锁定并且不能被更改,否则您可能无法重新呈现原始文档.

当客户更改其帐单地址时,旧订单的帐单邮寄地址是否重要?在这种情况下,帐单地址甚至不需要从订单链接,只需从客户链接.如果您要重新提交付款订单,则会将其显示在当前的帐单邮寄地址中.

  • +1:我的感情确切,希望我能再次投票.虽然规范化是我们努力的目标,但它首先依赖于业务规则 - 因为在规范化设置中,更新地址会影响历史记录. (2认同)

Lar*_*tig 5

就个人而言,尽管第二种解决方案在数据库理论方面来说“比较合适”,但我都不喜欢您的解决方案。如果您有重复的地址,则应将它们存储一次。

问题来自实施。下订单时,您将需要决定是要使用现有地址,更新现有地址(例如,使用新添加的公寓号码)还是创建新地址(客户已搬迁) ,有一个新的夏季地址,无论如何)。

为此,某人(直接或电话销售人员,客户或在线销售程序人员)必须决定是否要执行地址更新或地址添加操作。要让用户准确地做出这种决定是非常困难的。如果在确实需要添加时执行更新,则您的订单历史记录已损坏(旧订单指向新地址)。如果在更新是正确的选择时执行了加法运算,则您将消除标准化结构的值。

在这种情况下,我得出的结论是,最好的选择是为客户存储一个或多个地址,然后将地址信息复制到订单本身的地址字段中,这并非完全令人满意。

如果选择第二个选项,则需要计划为地址系统编写一个非常好的用户界面,以避免出现我上面提到的那种问题。请记住,不仅您自己,而且将来从事该项目的每个程序员都必须了解并同意该地址表的管理。


Chr*_*isJ 0

这取决于地址是否被重复使用。

如果您有“注册客户”表,那么您绝对应该选择“delivery_adress”、“billing_adress”等表,其中每条记录都链接到一个客户。