MongoDB 针对不同类型用户的数据库设计
MongoDB Database design for different type of users
我正在为一个有多种类型用户的网站制作 RESTful API。
- 管理员
- 供应商(公司名称、地址)
- 普通用户(姓名,phone)
用户将始终是他们最初注册的任何人(永久专业化)。
我正在使用 Mongoose 和 NodeJS,并且我为 User
提出了以下模型,以便我将来可以轻松管理新社交网站的登录。
{
userType: { type: String, lowercase: true },
contact: {
email: { type: String, lowercase: true, index: { unique: true, sparse: true } }
},
accounts: {
local: { password: String },
facebook: { id: String, token: String }
}
}
所以我的问题是,由于我有不同类型的用户并且每种类型都有不同的个人资料信息,我应该在哪里存储关于他们每个人的信息?
为每个类型制作不同的模型并在User
模型中添加一个引用键?或者有更好的方法吗?
问题似乎是关于一般数据库设计的。我建议用户之间共享的任何和所有字段都在您的用户模型中,然后将特定于一种用户的字段存储在专门为此的模型中,例如 "Admin",如果用户只是每一种类型的用户,您都可以存储类型和通用 ID 字段,然后根据类型和 ID 字段找到合适的用户类型特定数据。或者,您可以为每个用户类型建立一个 id 和模型关系,并且不要求任何这些字段以及检查是否为空。后一种方法可能会给您带来灵活性,允许用户属于多种类型(可能选择 log-in 作为)。
我认为将这些信息放在不同的集合中不是一个好主意。 MongoDB 的优势之一是您可以将所有相关的用户信息放在一个文档中,因此您可以通过 1 个查询检索它。
我将向用户模型添加 3 个字段:
adminInfo: { ... },
vendorInfo: { ... },
userInfo: { ... },
并根据用户类型填写正确的。其他 2 个字段可以是 null
(甚至根本不存在)。
不要走标准化路线 - 这里不需要它。
如果您考虑长远,我认为最好分开 collection。根据我的经验,这些字段会随着复杂性的增加而不断增加。想象一下,如果您必须通过供应商特定标志和用户特定标志将查询写入 select;这些查询加起来可能会很大。另外,想象一下如果你有很多用户类型检查:到处都是 if (type == VENDOR)...
将它们分开需要初步的努力collection;但从长远来看是值得的..
我正在为一个有多种类型用户的网站制作 RESTful API。
- 管理员
- 供应商(公司名称、地址)
- 普通用户(姓名,phone)
用户将始终是他们最初注册的任何人(永久专业化)。
我正在使用 Mongoose 和 NodeJS,并且我为 User
提出了以下模型,以便我将来可以轻松管理新社交网站的登录。
{
userType: { type: String, lowercase: true },
contact: {
email: { type: String, lowercase: true, index: { unique: true, sparse: true } }
},
accounts: {
local: { password: String },
facebook: { id: String, token: String }
}
}
所以我的问题是,由于我有不同类型的用户并且每种类型都有不同的个人资料信息,我应该在哪里存储关于他们每个人的信息?
为每个类型制作不同的模型并在User
模型中添加一个引用键?或者有更好的方法吗?
问题似乎是关于一般数据库设计的。我建议用户之间共享的任何和所有字段都在您的用户模型中,然后将特定于一种用户的字段存储在专门为此的模型中,例如 "Admin",如果用户只是每一种类型的用户,您都可以存储类型和通用 ID 字段,然后根据类型和 ID 字段找到合适的用户类型特定数据。或者,您可以为每个用户类型建立一个 id 和模型关系,并且不要求任何这些字段以及检查是否为空。后一种方法可能会给您带来灵活性,允许用户属于多种类型(可能选择 log-in 作为)。
我认为将这些信息放在不同的集合中不是一个好主意。 MongoDB 的优势之一是您可以将所有相关的用户信息放在一个文档中,因此您可以通过 1 个查询检索它。
我将向用户模型添加 3 个字段:
adminInfo: { ... },
vendorInfo: { ... },
userInfo: { ... },
并根据用户类型填写正确的。其他 2 个字段可以是 null
(甚至根本不存在)。
不要走标准化路线 - 这里不需要它。
如果您考虑长远,我认为最好分开 collection。根据我的经验,这些字段会随着复杂性的增加而不断增加。想象一下,如果您必须通过供应商特定标志和用户特定标志将查询写入 select;这些查询加起来可能会很大。另外,想象一下如果你有很多用户类型检查:到处都是 if (type == VENDOR)...
将它们分开需要初步的努力collection;但从长远来看是值得的..