怎样在mysql中设计好友关系库表
1.建立用户信息表
create table userinfo(id int(4) not null primary key, name varchar(20) not null unique key)engine=innodb default charset=utf8
2.建立好友关系表
create table friend(uid int(4) not null, foreign key(uid) references
userinfo(id),fid int(4) not null, foreign key(fid) references
userinfo(id),unique key(uid,fid))engine=innodb default charset=utf8
3.追加测试数据(满足uid<fid条件)
insert userinfo values(1111---9999,'namea---namei’)
insert friend values(1111,4444---6666)
insert friend values(5555,6666---9999)
4.查询好友(5555的好友)
select * from friend where uid=5555 or fid=5555
+-------+------+
| uid | fid|
+-------+------+
| 1111 | 5555 |
| 5555 | 6666 |
| 5555 | 7777 |
| 5555 | 8888 |
| 5555 | 9999 |
+-------+--------+
5.问题:
5.1.userinfo中的id和name不为null,且不可重复:table设计可以做到
5.2.friend中的uid和fid均不为null,且都来自于userinfo的id:table设计可以实现
5.3.(uid,fid)组合不可重复:table设计可以完成
5.4.好友关系的表达时,(1111,5555)和(5555,1111)有冗余,也会出现(1111,1111)这样的数据:这个在table设计实现比较麻烦,需要在程序层面实现,也即增加限制条件uid<fid即可
6.结果:
table设计达不到要求,或者较难达到要求时,可以在程序层面予以弥补。
3种解决方法,也谈谈这三种的弊端吧!
方法:
一.每创建一个用户.自动创建一个该用户的好友用户表.每一行的记录是一个好友记录.
二.做一个Frient的表,表中有两列,第一列UID是用户ID,第二列FID是对应该用户的好友
三,在用户信息的表中,有一个字段10000长度的varchar 里边用','号分割各个好友的ID
弊端:
一:只适合少量的用户论坛,如果有100万个注册用户,就得有100万张好友表,这样当用户一多,数据库会很大!
二:这种方法是给用户注册表创建一张好友关联表,这样或许是这三种方法中最好的方式了吧,但是注意记得要添加索引,不然查询起来,数据一多,会非常慢;
三、这样在程序方面会比较麻烦,先取出来,后添加数据,再update,感觉速度会上不来...........
对于非关系数据库,比如说健值数据库,可以使用一个大型的HASH表来存放,李四的所有好友以一个链接的方式串起来
。
比如:
linker表示链接
hash(李四)=linker(王五、张三、黄光、李明)
form_user(被添加用户)relation(用户关系)0:好友 1:拉黑但是还是想来问问看,想多了解一下相关的思路。
1、首先在手机QQ的“联系人”中,可以看到所有的分组;还有就是点击上面的“添加”,还可以直接添加QQ好友等等
2、如果添加的好友不想分配到现有的好友分组中,还可以再重新的创建新的分组,只要点记住其中的一个分组不动,一会就回自己弹出“分组管理”
3、想要创建新的分组,就必须进入“分组管理”,进入之后,就可以看见所有的分组。点击左上角的添加就可以添加分组,为分组命名就可以创建好。
4、如果想要删除分组,就可以点击分组前面的红圈标志。直接点击就可以确认删除,慎重选择删除,因为你不小心,就把改组的好友就给删除啦,再回复就是件麻烦的事。
5、想要创建一个个性的分组,就要用心取向每一个分组的符号设置,这是个追求个性的的年代,用心就会创造出属于自己的独特个性。
并且创建表需要有相应的级别比较高的权限,如果每注册一个用户就新建一张表,用户的权限太高了。
再次,按照你的说法,一个人假设有1000个好友,每个表也就1000条数据,相对于数据库来说,这个存储量是相当小的,没有发挥到很好的性能。sql server数据库几百万万条数据是没问题的。
最后,这样查询可能会带来方面之处,但是如果用到了存储过程,复杂的联合查询等(这些都是在数据库中常用的),你这样做就很难完成了。
所以,为何不把这些数据集中到一张表里面呢?
第一种:
好友有上限的话,假如是200吧,这个表就有201个字段,第一个字段是本身的Q号,其他字段是好友的Q号,但这样弄起来也挺麻烦的
第二种:
也是用一个表,主ID和好友ID设置成联合索引,一个主ID可以对应多个好友ID
第三种:
俩表关联,一个用户表,一个好友表,用户表中ID是好友表中的外键
第四种:
这个不知道是否可行,就是类似于第一种,但是就俩字段,一个主ID,一个好友ID,好友ID中,每个ID用符号分隔开
举个例子
QQ号好友QQ号
12,3,4
这种可能将来查询的时候比较费劲