【发布时间】:2011-11-12 07:33:40
【问题描述】:
我们的应用程序具有在线商店以及其他功能,通常要求用户在完成销售之前进行注册,在此过程中创建一个独特的customer_ID。当他们返回时,他们可以登录并从数据库中检索他们的联系方式和交易历史。
我们现在正在探索在“匿名”或“访客”客户的情况下该怎么做,向不想注册的客户开放在线商店,以及登录后端应用程序的销售,其中获取客户的电子邮件、邮政地址等太费时了。该解决方案在网上商店之外也有应用。
多家公司使用同一个数据库,数据库建立在party model结构之上,因此我们探索了几种方案:
- 将所有匿名客户存储在
transaction表中一个预定义的customer_ID下:-
customer_ID = 0代表每个匿名用户,customer_ID > 0代表每个真实用户- 这可以直接硬编码到应用程序中
- 但更多地涉及确定哪些客户属于哪家公司
-
customer_ID = 0的详细信息应该存在于数据库的customer表中还是作为应用程序中的对象存在?- 如果在数据库中,可以做哪些数据库级别的约束来确保它始终存在?
- 如果不在数据库中,则从
transaction.customer_ID到customer.customer_ID的外键约束不再起作用
-
customer_ID与公司party_ID相同- 更容易确定每家公司的总销售额等
- 这会使事情变得混乱,因为看起来公司是自己的客户,而不是其他独特的客户
-
- 为每个新的匿名客户(每个会话)生成一个唯一的
customer_ID- 如果相同的物理用户返回怎么办?会有很多记录重复同一种数据;电子邮件、送货地址等。
- 使用其他唯一键(例如电子邮件地址)来引用客户
- 并不总是可靠的,因为人们有时会使用多个电子邮件地址,或者留下旧地址。
- 如果没有电子邮件地址,例如车间、形式发票等,该怎么办?
- 其他一些受 Stack Overflow 启发的解决方案!
加法
#2 和 #3 的组合已在别处提出 - 尝试为每个客户存储一条记录,如果可能,使用电子邮件地址,或者在每次访问时使用新记录。
我应该指出,我们需要为每个匿名客户存储一条记录,但似乎关系数据库是为处理关系而构建的,所以有一个 NULL 或customer_ID 在transaction 表中没有引用实际客户记录似乎是错误的......
我还必须强调,这个问题的目的是确定有哪些现实世界的解决方案可以记录没有提供邮政地址或电子邮件地址的“临时”交易(想象超市结账)以及在线商店交易,其中电子邮件地址和邮政地址是否被存储。
SO 社区过去使用过哪些解决方案?
【问题讨论】:
-
我会选择电子邮件地址解决方案。电子邮件作为身份将为您提供您想要的大部分内容,您可能会遇到极少数人口的边缘情况。
-
我会使用
null来获取缺失信息,这就是null的发明目的。 -
你还需要匿名用户的数据库吗?您不能在浏览时将购物车内容存储在 cookie 中,然后使用它来触发订单吗?表单提交将订单及其信息发送给相关方。您的客户希望保持匿名是有原因的。
-
只是给你一个很好的建议。不要被“并不总是可靠”的案例吓到。没有任何案例可以让我 100% 可靠。有一些失败是可以的。学会生活在现实世界中,容忍一些失误。
-
你有一个很好的分析。我想说,就能够唯一识别匿名用户而言,电子邮件地址是您可以获得的最接近的地址。我了解人们使用不同的电子邮件地址,但并不经常使用,如果他们这样做,如果他们不想让他们的个人帐户充斥着垃圾邮件,他们很可能会使用相同的电子邮件地址进行在线购物。正如您所指出的,您的所有其他替代方案都存在重大缺陷。
标签: php mysql database-design web-applications data-modeling