Хорошо, поэтому я использую Sequelize с sqlite, чтобы создать систему голосования в реальном времени с веб-сокетами.Схема:
const Connection = sequelize.define("connection", {
socketId: {
type: Sequelize.UUID,
primaryKey: true
},
name: { type: Sequelize.STRING, unique: true, allowNull: false }
});
const Vote = sequelize.define("vote", {
postId: {
type: Sequelize.UUID,
primaryKey: true,
onDelete: "CASCADE"
},
socketId: {
type: Sequelize.UUID,
primaryKey: true,
onDelete: "CASCADE"
},
vote: {
type: Sequelize.INTEGER,
allowNull: false,
validate: {
isIn: [[-1, 1]]
}
}
});
Vote.belongsTo(Connection, { foreignKey: "socketId" });
const Post = sequelize.define("post", {
id: {
type: Sequelize.UUID,
defaultValue: Sequelize.UUIDV4,
primaryKey: true
},
content: { type: Sequelize.STRING, allowNull: false }
});
Post.belongsTo(Connection, {
foreignKey: "authorSocketId",
onDelete: "CASCADE"
});
Post.hasMany(Vote);
Когда клиент отключается, я обновляю все другие клиенты, какие сообщения были удалены.
Когда клиент отключается, мне нужно суммировать голоса каждого сообщения, которое клиентпроголосовал и отправить обновленный подсчет голосов клиентам.Но проблема в том, что мне нужно исключить клиента, отключившегося от суммы голосования.Это то, что я придумал, но это кажется слишком сложным:
Post.findAll({
attributes: [
"id",
[
literal(
// Sum up all the votes not by the disconnecting client
`(SELECT SUM("votes"."vote") FROM votes WHERE "votes"."postId"="post"."id" AND "votes"."socketId"!=$1 )`
),
"upvotes"
]
],
bind: [disconnectedSocketId],
where: {
// Post must not be by the disconnecting client
authorSocketId: { [Op.ne]: disconnectedSocketId }
},
include: [
{
// Post must be voted on by the disconnecting client
model: Vote,
required: true,
where: {
socketId: disconnectedSocketId
}
}
]
}).then(posts => {
// Once I have all the posts and their sums I update all the clients
});
Так что это мой вопрос.Есть ли более элегантный способ найти все сообщения, за которые проголосовал отключающий клиент, и суммировать все свои голоса, исключая голос отключенного клиента.
Я все еще новичок в SQL и реляционных базах данных, так что если у вас естьлюбой другой совет, который был бы оценен.