建材秒知道
登录
建材号 > 设计 > 正文

怎样在mysql中设计好友关系库表

搞怪的天空
搞怪的跳跳糖
2023-02-16 21:54:53

怎样在mysql中设计好友关系库表

最佳答案
淡淡的黄蜂
魁梧的眼神
2026-05-06 22:02:57

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设计达不到要求,或者较难达到要求时,可以在程序层面予以弥补。

最新回答
如意的时光
呆萌的小松鼠
2026-05-06 22:02:57

3种解决方法,也谈谈这三种的弊端吧!

方法:

一.每创建一个用户.自动创建一个该用户的好友用户表.每一行的记录是一个好友记录.

二.做一个Frient的表,表中有两列,第一列UID是用户ID,第二列FID是对应该用户的好友

三,在用户信息的表中,有一个字段10000长度的varchar 里边用','号分割各个好友的ID

弊端:

一:只适合少量的用户论坛,如果有100万个注册用户,就得有100万张好友表,这样当用户一多,数据库会很大!

二:这种方法是给用户注册表创建一张好友关联表,这样或许是这三种方法中最好的方式了吧,但是注意记得要添加索引,不然查询起来,数据一多,会非常慢;

三、这样在程序方面会比较麻烦,先取出来,后添加数据,再update,感觉速度会上不来...........

文静的凉面
落寞的菠萝
2026-05-06 22:02:57
对于关系数据库,可以设一个这样的字段,这个字段里存放了李四的所有好友,每个好友以“,”分隔;

对于非关系数据库,比如说健值数据库,可以使用一个大型的HASH表来存放,李四的所有好友以一个链接的方式串起来

比如:

linker表示链接

hash(李四)=linker(王五、张三、黄光、李明)

安详的月饼
快乐的季节
2026-05-06 22:02:57
好友关系是双向的:user1 >user2与 user2 >user1是重复的。目前业务很简单就是好友关系。预想4个字段解决:id(自增)to_user(添加用户)

form_user(被添加用户)relation(用户关系)0:好友 1:拉黑但是还是想来问问看,想多了解一下相关的思路。

顺心的咖啡豆
外向的大碗
2026-05-06 22:02:57

1、首先在手机QQ的“联系人”中,可以看到所有的分组;还有就是点击上面的“添加”,还可以直接添加QQ好友等等

2、如果添加的好友不想分配到现有的好友分组中,还可以再重新的创建新的分组,只要点记住其中的一个分组不动,一会就回自己弹出“分组管理”

3、想要创建新的分组,就必须进入“分组管理”,进入之后,就可以看见所有的分组。点击左上角的添加就可以添加分组,为分组命名就可以创建好。

4、如果想要删除分组,就可以点击分组前面的红圈标志。直接点击就可以确认删除,慎重选择删除,因为你不小心,就把改组的好友就给删除啦,再回复就是件麻烦的事。

5、想要创建一个个性的分组,就要用心取向每一个分组的符号设置,这是个追求个性的的年代,用心就会创造出属于自己的独特个性。

任性的手机
曾经的薯片
2026-05-06 22:02:57
针对sql server数据库来说(sql server比mysql好一些,比oracle差),如果有一个万个用户就一万张表。数据库对表数量的支持也是有限制的。

并且创建表需要有相应的级别比较高的权限,如果每注册一个用户就新建一张表,用户的权限太高了。

再次,按照你的说法,一个人假设有1000个好友,每个表也就1000条数据,相对于数据库来说,这个存储量是相当小的,没有发挥到很好的性能。sql server数据库几百万万条数据是没问题的。

最后,这样查询可能会带来方面之处,但是如果用到了存储过程,复杂的联合查询等(这些都是在数据库中常用的),你这样做就很难完成了。

所以,为何不把这些数据集中到一张表里面呢?

时尚的眼睛
妩媚的小土豆
2026-05-06 22:02:57
可以有几种设计方式

第一种:

好友有上限的话,假如是200吧,这个表就有201个字段,第一个字段是本身的Q号,其他字段是好友的Q号,但这样弄起来也挺麻烦的

第二种:

也是用一个表,主ID和好友ID设置成联合索引,一个主ID可以对应多个好友ID

第三种:

俩表关联,一个用户表,一个好友表,用户表中ID是好友表中的外键

第四种:

这个不知道是否可行,就是类似于第一种,但是就俩字段,一个主ID,一个好友ID,好友ID中,每个ID用符号分隔开

举个例子

QQ号好友QQ号

12,3,4

这种可能将来查询的时候比较费劲