【发布时间】:2020-05-20 13:35:45
【问题描述】:
我将创建注册、登录功能。 用户可以使用电子邮件或手机号码进行注册,因为我需要在这两个字段上都有索引,所以我在想什么是实现良好性能和正确方法的最佳实践。
用户可以使用手机或电子邮件注册,在注册时,这些字段之一将为空,并且字段必须是唯一的。 什么是最好的方法。
【问题讨论】:
标签: mongodb indexing database-design schema
我将创建注册、登录功能。 用户可以使用电子邮件或手机号码进行注册,因为我需要在这两个字段上都有索引,所以我在想什么是实现良好性能和正确方法的最佳实践。
用户可以使用手机或电子邮件注册,在注册时,这些字段之一将为空,并且字段必须是唯一的。 什么是最好的方法。
【问题讨论】:
标签: mongodb indexing database-design schema
正如您提供的详细信息,可能存在三种数据情况:
假设用户可以创建两个帐户,一个使用电话号码,另一个使用电子邮件。
而且,完全取决于用户是在使用电话号码创建帐户后提供电子邮件,还是在使用电子邮件创建帐户后提供电话号码。
所以,我认为最好继续使用“phoneNumber”和“email”这两个字段创建复合索引。 因为,这将涵盖所有三种集合情况。
db.collection.createIndex( { phone:1, email: 1 } )
上面将创建索引,同时使用这两个字段。
【讨论】:
一般来说,用户集合的结构是这样的:
用户:
_id
fullname
username
email
phone
etc.
将注册详情与用户详情分开将有助于根据其功能管理数据。因此,引入一个特定于注册的字段。用户的文档可以具有以下形状的 registration 字段:
registration: { email: "myname@mymail.com" }
-or-
registration: { phone: "999-888-1234" }
这将允许注册电话或电子邮件是唯一的。您可以分别为这两个字段创建唯一索引。为此,请使用partial indexing。例如:
db.user.createIndex(
{ "registration.email": 1 },
{ unique: true, partialFilterExpression: { "registration.email": { $exists: true } } }
)
db.user.createIndex(
{ "registration.phone": 1 },
{ unique: true, partialFilterExpression: { "registration.phone": { $exists: true } } }
)
这也可能意味着电话或电子邮件等某些数据的重复。应用程序需要根据功能来处理它。
要考虑的选项:
【讨论】:
即使其中一个字段为空,您也可以继续使用sparse 索引在这两个键上分别创建索引。但是集合上的稀疏索引不能返回完整的结果,你必须小心它的使用。
另一种方法是创建一个像“primary_login_key”这样的字段,它可以是电子邮件或手机号码。这允许您拥有一个非稀疏索引。但是,如果用户想要将多个方法连接到他的配置文件,这不会像将来那样扩展,无论如何您都必须在它们上创建这些键和索引。
【讨论】: