작성
·
1.1K
0
안녕하세요. 정말 좋은 강의와 소스코드 공개 정말 감사드립니다.
강의의 내용보다 더 나간 내용이긴 하지만 혹시나 가능하시다면 하여 질문드립니다.
user1, user2 가 있을 때 user1 이 user2 를 사용자 차단할 경우 게시글 같은 것이 있을 경우
user1 에게도 user2 의 게시물이 안보여야하고 user2 에게도 user1 의 게시물이 안보여야 하고
DM 의 경우에도 (channelchat 과 같은 단톡은 일단 고려하지 않음)
user1 이 user2 를 차단하였으므로
user1 의 사용자가 표시되는 리스트에 user2 가 안보여야하고
user2 의 사용자가 표시되는 리스트에도 user1 이 보이지 않아야하며
DM 도 user1 이 user2 에게 보낼 수 없고 user2 가 user1 에게도 보낼 수 없고
user1 과 user2 의 DM 이 있다손 치면 그것들이 차단을 했으니 상호간에 삭제되어야하고 (paranoid 방식일지라도)
하는 시나리오가 있을 경우 해당 block 이라는 user vs user 의 다대다 관계를 어떻게 구성하는 것이 좋을지 문의드립니다.
https://stackoverflow.com/questions/54605069/how-should-i-design-a-user-blocking-system
Table User
id (pk) | user_name
1 | a
2 | b
3 | c
Table Post
id (pk) | user_id (fk)
1 | 1
2 | 3
3 | 2
4 | 2
Table Block
id (pk) | blocker_id (fk) | blocked_id (fk)
1 | 1 | 2
2 | 2 | 1
select * from User join Block on User.id = Block.blocker_id or User.id = Block.blocked_id
select *
from Post p
where p.user_id = @current_user_id and
not exists (select id
from Block
where Block.blocker_id = p.user_id or Block.blocked_id = p.user_id)
이런식으로 SQL 을 짜면 된다고 stackoverflow 에서 나와 있는데요
User 의 associate 부분에 이렇게 구성하면 될까요?
static associate(db) {
db.User.belongsToMany(db.User, {through: "Block"});
}
답변 4
0
db.User.belongsToMany(db.User, {through: "block", as: "Blocker", foreignKey: "BlockedId"});
db.User.belongsToMany(db.User, {through: "block", as: "Blocked", foreignKey: "BlockerId"});
포린키와 as는 서로 반대여야 합니다.
0
다음과 같이 하니 block 테이블이 이렇게 생성이 되었습니다. 이게 맞는걸까요? 아니면 위에 것이 맞는걸까요?
db.User.belongsToMany(db.User, {through: "block", as: "Blocker", foreignKey: "BlockerId"});
db.User.belongsToMany(db.User, {through: "block", as: "Blocked", foreignKey: "BlockedId"});
0
다음과 같이 하였더니 테이블이 생각하는 것과 다르게 생성이 된 것 같은데요. 이렇게 된 게 맞는걸까요?
foreignKey 같은 설정도 추가해야 할까요??
db.User.belongsToMany(db.User, {through: "block", as: "Blocker"});
db.User.belongsToMany(db.User, {through: "block", as: "Blocked"});
0
dm은 보낼수는 있게 하되 받는쪽에서는 알림이 안 가도록 해야 보내는 사람이 자신이 차단된지 모를 것 같네요.
시퀄라이즈 코드에서는 as: 'Blocker'랑
db.User.belongsToMany(db.User, {through: "Block", as: 'Blocked'});
두 개 추가하셔야 쌍방간에 다대다가 연결됩니다.
감사합니다!! belongsTo 는 targetKey, foreignKey 가 사용되니 곰곰히 생각하니 이렇게 해야하네요. 정말 감사해요. 이런 조언을 받기 정말 힘든데...