——表设计有关问题

求助——表设计问题
有个用户关系表    Relation(user1ID,user2ID,remarks)

1 用户关系有针对单个用户的属性,比如说关系备注remarks

所以当用户1 与用户2建立关系时;用户1会写备注remark
而用户2同意时,也会建立一条数据,

所有数据有两行
(A,B,something)
(B,A,something)

现在问题来了,当用户2同意了用户1的请求,用户1的数据才真正有效
两种方案:
1 Relation表增加ischeck字段  Relation(user1ID,user2ID,remarks,ischeck)
当用户A向用户B发请求时,在表里插入一行数据,ischeck=0;当用户A 同意后,update 一下用户A的数据将ischeck=0 改为 ischeck=1;
这样 用户A查自己的相关用户时 这样就可以  
select user2ID from Relation where user1ID=A and ischeck=1
优点:用户A 查自己关联用户时,查询简单
缺点:每两个用户建立关系时,有2次插入操作1次更新操作;对于使用很频繁的表,更新操作会造成表锁,会影响性能


2 表结构不变
用户A查自己相关用户时,
select user2ID from Relation T1 JOIN Relation T2
on T1.user1ID=T2.user2ID and T1.user2ID=T2.user1ID
where T1.user1ID=A

优点:每两个用户建立关系时,有2次插入操作,无更新操作,避免了表的锁;
缺点:查询时会有一个表的自链接


大家觉得哪个方案性能会好一些



数据库设计 性能优化

------解决方案--------------------
最终执行效率参考 执行计划
1:第一种方案,单页存储行数多,查询速度快。
每两个用户建立关系时,有1次插入操作1次更新操作.应该是一次插入操作。
2:第二种方案,单页存储行数少,数据存在冗余。

如果更新操作不频繁的话,个人建议采用第一种。
不过具体的还要看一下执行效率,查看一下语句的执行计划