mysql - 我是否允许在 Sequelize 中定义用户和服务器模型之间的多对多和一对多关系?
问题描述
我有 2 个模型,称为 User 和 Server,我对它们关系的口头描述是这样的:
用户可以创建服务器,因此是其所有者。按照这个逻辑,我需要在这两个模型之间实现一对多的关系。这意味着服务器应该有一个 userId 列,其中包含用户/所有者的 id。
用户可以加入多个服务器,一个服务器可以被多个用户加入,所以我需要在这两个模型之间实现多对多的关系,并且还要有一个联结表。
所以我的问题是我可以像这样在模型之间应用两种关系:
let User = require('./models/User');
let ServerUser = require('./models/ServerUser');
let Server = require('./models/Server');
User.hasMany(Server)
Server.belongsTo(User)
User.belongsToMany(Server, { through: ServerUser });
Server.belongsToMany(User, { through: ServerUser });
让我觉得这行不通的原因是——一旦建立了关系,Sequelize 就会为您提供一些可以使用的神奇方法。例如,在我的情况下,我有这个:
let name = req.body.name;
let thumbnail = req.body.image;
let userId = req.body.userId
let user = await User.findByPk(userId)
let socketServer = await Server.create({
name: name,
thumbnail: thumbnail
});
user.addServer(socketServer)
由于我已经定义了用户和服务器之间的关系,我可以使用 addServer() 来执行两件事之一,具体取决于模型之间的关系是一对多还是多对多。
如果我定义了多对多关系,执行
user.addServer(socketServer)
将在联结表中创建一条记录,该记录将链接 userId 和 serverId。如果我定义了一对多关系,执行
user.addServer(socketServer)
会将服务器的 userId 列更新为用户的 id
所以现在我已经应用了模型之间的两种关系,当我执行时user.addServer(socketServer)
,我只用用户的 id 更新服务器的 userId 列但是我没有在连接表中获得创建多对的记录-许多关系。
这让我相信我一次只能使用一种关系,但是如果没有这两种关系,我该如何实现我想要实现的目标呢?
解决方案
观点
在我看来,您提出的逻辑似乎是用户创建服务器,而服务器内的用户不断创建服务器。结果正确吗?
一个用户不应该创建服务器,而其他用户不应该进入服务器吗
我的建议是在用户和服务器之间创建一对多并具有特权表,因此创建服务器的一个用户有权获得他或她想要的任何东西。
推荐阅读
- javascript - 为什么Jquery Ajax get 方法实现
- java - 完成另一项任务后执行一项任务
- html - 响应式输入之间的距离
- c# - 如何从返回的局部视图中访问数据以及 JSON 数据
- python - Detect Canvas Image Overlapping Other Canvas Image Python Tkinter
- unity3d - unity3d 使用两个向量和中间的某个点计算插值级别
- html - 在基于 HTML 的电子邮件中,如何处理括号字符?
- javascript - 大型数据集和每个订阅唯一列表的客户端的 Web 套接字订阅管理?
- git - git rebase 如何/为什么避免合并提交?
- sql - 使用参数调用方法以对应于多个字符串之一的最佳方法(Ruby)