我正在忙着创建一个基本的电子商务网站,并想知道以下两个选项中最好的方式是关于我存储结算和发送地址的方式。我对任何其他建议持开放态度。
我可以在订单表中包含帐单邮寄地址和递送地址:
order
-------
billing_name
billing_address
billing_state
shipping_name
shipping_address
shipping_state
否则我可以创建另一个只存储订单地址的表:
order
-------
billing_address_id
shipping_address_id
order_address
-------
address_id
name
address
state
答案 0 :(得分:8)
我通常会选择第二个。这将让您为不同类型的客户提供许多不同的地址。但我通常会首先在客户层面解决这个问题,然后解决订单和发票。
但是,您可能需要解决订单工作流程/业务规则的性质。
订单完成后,是一份文件(如发票)吗?如果是,那么地址应该在当时被锁定并且不能被更改,否则您可能无法重新呈现原始文档。
当客户更改其帐单邮寄地址时,旧订单的帐单邮寄地址是否重要?在这种情况下,帐单地址甚至不需要从订单链接,只需从客户链接。如果您要重新提交付款订单,则会将其显示在当前的帐单邮寄地址中。
答案 1 :(得分:5)
就我个人而言,我喜欢你的解决方案,尽管第二种解决方案在数据库理论方面是“更严格的”。如果你有重复的地址,你应该存储一次。
问题在于实施。下订单时,您将不得不决定是否要使用现有地址,更新现有地址(例如,使用新添加的公寓号)或创建新地址(客户已移动) ,有一个新的夏季地址,无论如何)。
为了做到这一点,某人(直接或电话销售的员工,客户或在线销售计划)将必须决定您是在执行地址更新还是地址添加操作。要让用户准确地做出这种决定是非常困难的。如果在确实需要添加时执行更新,则您的订单历史记录已损坏(旧订单指向新地址)。如果在更新是正确选择时执行添加,则您已消除了规范化结构的值。
在这种情况下,我并非完全愉快地得出结论:最佳选择是为客户存储一个或多个地址,然后将地址信息复制到订单本身的地址字段中。
如果您选择第二个选项,则需要计划将非常好的用户界面写入地址系统,以避免上面提到的那种问题。请记住,不仅是你,而且将来在项目上工作的每个程序员都必须理解并同意该地址表的管理。
答案 2 :(得分:2)
编辑:根据新评论,您要从地址簿复制到order_address表,它可能会使您的订单表更清洁,但如果您要去无论如何要复制数据,我想把它复制到它所属的记录中。
-
两者,对运输进行非正规化处理,并将其与订单保持一致。存储很便宜,而且比在地址表中管理大量额外数据更容易。但请保持地址分开,以便客户不必再次输入。如果你进行非规范化,那么你不必在地址表中为它们保留明确的记录,并担心进行软删除。
不要低估管理地址的复杂性。如果我在您的系统中输入一个地址,并将其与我的帐户关联,然后意识到它的某些部分是错误的,那么您需要删除旧地址并创建一个新地址。删除可以是软删除,但需要删除。您可以尝试确定我是在放置新地址,还是大幅更改旧地址。或者您只能允许添加和删除地址。但是当地址发生操作时,先前的订单需要首先维护分配给它的数据。编辑已与订单关联的地址,将在订单已发送之后修改订单所在的位置。确保您仔细考虑这些情况。有几种方法可以解决潜在的问题,但您的决定实际上取决于您希望如何处理这些情况。如果您在放置地址信息时将其归一化并将地址信息复制到订单中,那么编辑地址表中的地址就不再是问题了。决定如何处理这些情况,您的数据库架构只需要支持它。这两种选择都有效。
答案 3 :(得分:2)
我会将地址保存在单独的表中,并从订单中引用它们。我将包含一个“CurrentAddress”属性,以便最终用户可以从其当前地址列表中“删除”该地址。该值仍然存在于表中,因此以前的订单可以引用该地址用于历史目的,但它不再是订购时的可选地址。
答案 4 :(得分:2)
将地址拉入单独的表格会更加规范化,但要小心。如果您允许更新地址,则可能无法跟踪订单最初打算到/运往哪里。
答案 5 :(得分:1)
第二种方法比第一种方法有一些优点。简单地使地址变得更容易,因为它们通常是相同的,错误的可能性较小。此外,如果您在帐户中保存地址,第二种方法将为您提供更轻松的时间。也就是说,您需要验证给定地址实际上属于与订单相同的帐户,您可以通过在customer_id
和order
表中包含order_address
字段来执行此操作,然后在customer_id
的主键和order_address
到order
的外键中加入order_address
。
答案 6 :(得分:0)
这取决于地址是否被重复使用。
如果您有“注册客户”表,那么您一定要选择“delivery_adress”,“billing_adress”等表格,并将每条记录链接到客户。
答案 7 :(得分:0)
如果您计划在您的网站中注册用户,那么包含结算和送货地址ID的表格会更好,然后您可以将订单放在其他表格中,并使用您已有的ID来关联订单信息< = >账单/送货地址