我正在设计一个数据库,它将成为市场网站的后端。将有买家和卖家创建帐户。我打算为所有类型的帐户和一个中央帐户表格提供单一登录表格,该帐户表格将保存所有类型帐户的共同帐户详细信息,用户凭据将被存储,并且可以在任何用户登录时进行检查。< / p>
用户凭据将包含电子邮件和密码。表格的电子邮件列将是一个唯一列,因此电子邮件地址只能与单个帐户相对应。
但是当用户想要删除他们的帐户时会出现问题。用户将能够终止其帐户,但与其帐户相关的大部分数据应保留在数据库中。有必要保留数据,因为它通常与其他用户和站点相关。例如消息,订单,争议等。由于必须保留数据以供买方查看过去订单中卖家的详细信息,实际上所有帐户数据都必须保留并且只是被赋予终止状态。
那么,如果用户终止了他们的帐户,但他们尝试使用相同的电子邮件地址创建新帐户,会发生什么?他们不会被允许,因为已经有一个帐户有该电子邮件地址和终止状态。
我的第一个想法是在帐户终止时用空值替换电子邮件地址。因此,电子邮件可以再次用于新帐户,但后来我意识到一个唯一的列只能有一个NULL值。
我的下一个想法是将期限帐户转移到另一个表格并删除电子邮件列。但是这没有意义,因为数据库中的许多其他表将具有引用原始表的外键。
另一个想法是拥有三个核心帐户表。
AccountInventory:AccountID_PK,状态
ActiveAccounts:AccountID_PK,电子邮件,密码,PasswordSalt,AccType,AccStatus
TerminatedAccounts:AccountID_PK,AccType
这样我可以在其他表中使用外键引用AccountInventory表。使用ActiveAccounts表在用户登录时检查凭据。并将已删除的帐户移至TerminatedAccounts表,同时仍保持该帐户的其他数据的参照完整性,因为外键引用AccountInventory。
这是否是实现此功能的最佳方式,使用户能够在维护数据完整性的同时重复使用电子邮件地址?对于我来说,如果帐户ID基本上除了帐户ID之外什么都没有,那么看起来有点尴尬,所有其他需要加入ActiveAccounts或终止帐户的表都必须加入。
这是最好的解决方案,还是有更聪明的方法呢?
亲切的问候, 邓肯
答案 0 :(得分:3)
听起来你应该改变你对用户帐户的看法。
在您的系统中,用户实际上不允许删除其帐户。当您考虑此问题时,请停止使用 delete ;它会让你的想法变得模糊。
允许用户 多次启动和停止与您的关系。因此,他们的帐户可以有许多“活动”和“非活动”状态,每个状态都有一个开始和结束日期。 (你可能有比“主动”和“无效”更好的词。)
这取决于您的应用,但我不认为除了帐户状态之外的任何内容都必须被识别为“有效”或“无效”。换句话说,我不认为历史消息,订单和争议需要了解帐户的当前状态。
要考虑的一件更重要的事情
假设我有自己的域名 - wibble.com - 我有一个名为mary@wibble.com的电子邮件帐户。我让我的域名失效了。其他人,也叫玛丽,注册它。当新的mary@wibble.com尝试在您的网站上创建帐户时会发生什么?
如果这听起来很牵强,本地大学会在注册时为每位学生分配电子邮件地址。大学毕业6个月后终止这些帐户。用户名基于您的真实姓名中的字母。终止后,终止的电子邮件地址可立即重复使用。相同的电邮地址;不同的人。会发生什么?
答案 1 :(得分:1)
基于电子邮件和状态的具有唯一键的用户表怎么样?
您仍然可以拥有参照完整性,但在该用户想要取消第二个帐户时会出现问题。在这种情况下,您可以将这两个帐户合并为同一用户。
如果无法进行合并,您还可以创建该帐户有效的日期范围,并使其成为您的唯一索引的一部分,并强制执行仅使用触发器或类似内容的电子邮件地址。< / p>