Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 关于用户帐户和帐户删除的数据库体系结构_Sql Server_Sql Server 2008_Database Design - Fatal编程技术网

Sql server 关于用户帐户和帐户删除的数据库体系结构

Sql server 关于用户帐户和帐户删除的数据库体系结构,sql-server,sql-server-2008,database-design,Sql Server,Sql Server 2008,Database Design,我正在设计一个数据库,将作为一个市场网站的后端。将有买家和卖家创建帐户。我计划为所有类型的帐户提供一个单一的登录表单和一个中央帐户表,该表将保存所有类型帐户的通用帐户详细信息,其中将存储用户凭据,并可在任何用户登录时进行检查 用户凭据将包括电子邮件和密码。该表的电子邮件列将是唯一的列,因此电子邮件地址只能对应于单个帐户 但是当用户想要删除他们的帐户时,问题就出现了。用户可以终止其帐户,但与帐户相关的大部分数据应保留在数据库中。有必要保留数据,因为它将与其他用户和现场相关。例如,信息、订单、争议等

我正在设计一个数据库,将作为一个市场网站的后端。将有买家和卖家创建帐户。我计划为所有类型的帐户提供一个单一的登录表单和一个中央帐户表,该表将保存所有类型帐户的通用帐户详细信息,其中将存储用户凭据,并可在任何用户登录时进行检查

用户凭据将包括电子邮件和密码。该表的电子邮件列将是唯一的列,因此电子邮件地址只能对应于单个帐户

但是当用户想要删除他们的帐户时,问题就出现了。用户可以终止其帐户,但与帐户相关的大部分数据应保留在数据库中。有必要保留数据,因为它将与其他用户和现场相关。例如,信息、订单、争议等。由于必须保留数据,以便买家查看其过去订单中有关卖家的详细信息,因此实际上必须保留所有帐户数据,并仅给出终止状态

那么,一旦用户终止了他们的帐户,但他们试图用相同的电子邮件地址创建一个新帐户,会发生什么呢?他们将不被允许这样做,因为已经有一个帐户具有该电子邮件地址和终止状态

我的第一个想法是在帐户终止时将电子邮件地址替换为空。因此,电子邮件可以再次用于新帐户,但后来我意识到,唯一列只能有一个空值

我的下一个想法是将被终止的帐户转移到另一个表中,并删除电子邮件列。但是,这没有意义,因为数据库中的许多其他表将具有引用原始表的外键

另一个想法是建立三个核心账户表

AccountInventory:AccountID\u主键,状态

ActiveAccounts:AccountID\u PK、电子邮件、密码、密码、帐户类型、帐户状态

终止帐户:帐户ID\u PK,帐户类型

这样,我可以在其他表中使用外键引用AccountInventory表。使用ActiveAccounts表在用户登录时检查凭据。并将已删除的帐户移动到TerminatedAccounts表,同时仍保持该帐户的其他数据的引用完整性,因为外键引用AccountInventory

这是实现这一功能的最佳方式吗?即允许用户在维护数据完整性的同时重用电子邮件地址?对于我来说,拥有一个AccountInventory表似乎有点尴尬,它本质上只包含帐户ID,而所有其他需要与ActiveAccounts或终止帐户联接的表都必须联接帐户ID

那么这是最好的解决方案还是有更聪明的方法

亲切问候,,
Duncan

基于电子邮件和状态使用唯一键的用户表怎么样

您仍然可以具有引用完整性,但当该用户想要取消第二个帐户时会出现问题。在这种情况下,您可以合并这两个帐户,因为它们指向同一个用户


如果无法进行合并,您还可以创建一个日期范围,其中该帐户是有效的,并使其成为您唯一索引的一部分,并使用触发器或类似的方法强制执行只有一个电子邮件地址在该时间有效。

对于具有基于电子邮件和状态的唯一键的用户表如何

您仍然可以具有引用完整性,但当该用户想要取消第二个帐户时会出现问题。在这种情况下,您可以合并这两个帐户,因为它们指向同一个用户


如果无法进行合并,您还可以创建一个日期范围,其中该帐户是有效的,并将其作为唯一索引的一部分,并使用触发器或类似工具强制执行只有一个电子邮件地址在该时间有效。

听起来您应该改变对用户帐户的看法

在您的系统中,实际上不允许用户删除其帐户。当你考虑这个问题时,停止使用delete这个词;它模糊了你的思想

用户可以多次启动和停止与您的关系。因此,他们的帐户可以有许多“活动”和“非活动”状态,每个阶段都有开始和结束日期。(您可能有比“活动”和“不活动”更好的词。)

这取决于你的应用程序,但我认为除了他们的帐户状态外,任何东西都不必被识别为“活动”或“非活动”。换句话说,我不认为历史信息、订单和争议需要了解帐户的当前状态

还有一件重要的事情要考虑

假设我有自己的域名——wibble.com——并且我有一个名为mary@wibble.com. 我让我的域名失效了。另一个人,也叫玛丽,登记了它。当新的mary@wibble.com是否尝试在您的网站上创建帐户


如果这听起来有些牵强的话,当地的大学会在注册时给每个学生分配电子邮件地址。大学在你毕业后6个月终止这些账户。用户名基于您的真实姓名中的字母。终止后的电子邮件地址可在终止后立即重新使用。相同的电子邮件地址;不同的人。应该怎么办?

听起来你应该改变你对用户帐户的看法

在您的系统中,实际上不允许用户删除其帐户。当你考虑这个问题时,停止使用delete这个词;它模糊了你的思想

用户可以多次启动和停止与您的关系。因此,他们的帐户可以有许多“活动”和“非活动”状态,每个阶段都有开始和结束日期。(您可能有比“活动”和“不活动”更好的词。)

这取决于你的应用程序,但我认为除了他们的帐户状态外,任何东西都不必被识别为“活动”或“非活动”。在ot