在应用程序中合并用户帐户的体系结构

时间:2019-08-05 10:51:46

标签: database-design architecture multiple-accounts multiple-login

在我当前运行的应用程序版本中,我对用户电话号码的唯一性没有任何限制。这意味着一个电话号码可以与多个帐户关联。用户的电子邮件ID只有唯一的约束。

场景1:用户使用电子邮件ID和电话号码注册=>我们在数据库中创建了一个新的用户记录,以尊重电子邮件的唯一性。 情况2:用户仅注册号码=>我们在数据库中创建了一个新的用户记录,其中包含我生成的唯一虚拟电子邮件。

在这两种情况下,我都保持电子邮件的唯一性,但忽略了对电话号码的任何限制。

现在,我需要在电子邮件和电话号码上都保持唯一性属性。因此,我需要合并共享相同电话号码的两个用户帐户(虚拟电子邮件和真实电子邮件)。

问题在于,这两个帐户都可以在数据库的多个位置具有多个引用。将两个帐户合并在一起的方法应该是什么?

编辑:我在后端使用MongoDB。它为每个文档生成“ _id”字段,并将其用作该文档的主键。因此,此“ _id”字段用作该用户文档到数据库其余部分的外键。

用户集合中的一个示例文档,其中用户具有已验证的电子邮件=>

{
    _id: ObjectId("5d443787f86f9a3dfa782a3c"),
    name: 'user name',
    email: 'VerifiedUserEmail@gmail.com',
    phone_number: '1234567890'
}

用户集合中的另一个示例文档,其中用户具有重复的电话号码=>

{
    _id: ObjectId("5c9a1146c89b2d09740ccd17"),
    name: 'dummy user name',
    email: 'DummyUserEmail@dummy-emails.com',
    phone_number: '1234567890'
}

1 个答案:

答案 0 :(得分:0)

实际上,您可以做两件事,要么创建一个间接级别(将运行时查询的ID映射到一起的映射表),要么必须更新引用该ID的所有其他位置。 / p>

就我个人而言,我将考虑仅进行更新并删除旧记录。这将使您有机会根据具体情况决定如何合并记录。简单地更新外键可能会创建很多您不期望的奇怪的笛卡尔。