新浪微博的“关注功能”数据库是如何设计的?

风之子1 2010-12-20 05:48:21
在新浪微博中,一个用户可以关注另外一个用户,当关注后,这个被关注用户的博客更新就显示在关注用户的主页面中。
我想问一下,它的这个关注功能部分的数据库是如何设计的,比如用户A关注用户B,是不是就在数据库中生成一条关注记录(估且不管它的关注表具体字段都有什么);还是说在A用户表中修改关注用户ID这么个字段(可能会存在,将关注的用户Id,以逗号分隔的形式存在这个字段中),是这两种方式中的哪一种呢,还是说是别的方式?
假设此处用的是第一种方式,比如用户A关注了10000个用户,而用户A在登陆后,将显示这些被关注好友的更新,那按照我的思路就是系统先查出这10000个用户的ID,再根据这些ID以时间排序获取更新博客内容(当然这里运用到了分页的功能),我就是想问一下,这种方式是不是性能太低了。如果我想错了,还请会的朋友帮忙纠正一下!它的实际设计方式或者更好的设计方式都有什么方式呢?
...全文
4751 38 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
Liu_cy88 2012-12-10
  • 打赏
  • 举报
回复
我觉得应该跟QQ的好友原理差不多 关注了某个人,就相当于QQ加了某个人为好友类似 首先有一个用户表 记录用户自己的ID 然后再有一个好友关系表,比如A和B是好友 就在好友关系表里面添加一条A和B的对应关系记录 关注的原理,我想也是这样吧
极品老土豆 2012-12-10
  • 打赏
  • 举报
回复
做过销售系统么?知道单据和明细的关系么? 知道的话,就不难知道这个了。
xiaoyong990 2012-12-10
  • 打赏
  • 举报
回复
引用 35 楼 anjolan 的回复:
喵喵喵喵喵喵喵Java code?1System.out.println("Holle world!~");
酱油党。。。
anjolan 2012-12-09
  • 打赏
  • 举报
回复
喵喵喵喵喵喵喵

System.out.println("Holle world!~");
fihuang 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 maco_wang 的回复:]

新浪围脖怎么实现的我不知道,但是csdn怎么实现的貌似可以看得出来:
MySQL Error
Message: MySQL Query Error
SQL: SELECT * FROM uchome_feed WHERE uid IN (0,174027,144477,143357,142827,142004,141254,141171,140805,140631,146288,14762……
[/Quote]csdn这个太业余了吧 这个性能应该非常非常底
fihuang 2011-06-28
  • 打赏
  • 举报
回复
网上查了一下 新浪微博用的mysql+分布式缓存等等高效率的架构
但是我个人还是觉得新浪微博应该用了nosql数据库 facebook twitter都用Cassandra
cd731107 2011-06-27
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 maco_wang 的回复:]
新浪围脖怎么实现的我不知道,但是csdn怎么实现的貌似可以看得出来:
MySQL Error
Message: MySQL Query Error
SQL: SELECT * FROM uchome_feed WHERE uid IN (0,174027,144477,143357,142827,142004,141254,141171,140805,140631,146288,147622……
[/Quote]
这句如果放在一起,只是一句,感觉有可能会超长
叶子 2011-06-26
  • 打赏
  • 举报
回复
新浪围脖怎么实现的我不知道,但是csdn怎么实现的貌似可以看得出来:
MySQL Error
Message: MySQL Query Error
SQL: SELECT * FROM uchome_feed WHERE uid IN (0,174027,144477,143357,142827,142004,141254,141171,140805,140631,146288,147622,148647,167268,167266,167263,158764,158620,154916,152488,149747,140195,140170,65387,56761,56508,54209,53389,52673,48628,43679,82488,84792,85262,138409,138259,137553,137179,134229,124338,109927,86287,41757,2708660,960311,834084,764443,429088,407988,394379,378191,378188,1025919,1528198,1972098,2636949,2635644,2507505,2278680,2262135,2262133,2240424,2127090,366280,358913,211482,207897,204615,203295,192138,192134,189762,186169,219044,228305,246254,354172,334301,328912,327377,321864,319738,308807,265358,181008,41195,19087,10242,10102,9032,7374,6957,6858,6762,6277,11471,11555,11694,19083,18423,16318,15548,15066,13676,13439,12506,6028,5884,967,951,914,715,609,547,539,490,1140,1141,1142,5801,4588,4173,2983,2292,2150,1716,1703,318,40393,32796,32795,32794,32279,32246,31981,30812,30076,32804,32806,33159,38729,38725,38215,37228,37170,37006,35129,33493,29990,29762,25327,23946,23945,21912,20928,20927,20875,20874,26420,27771,27822,29612,29599,29437,) ORDER BY dateline DESC LIMIT 0,50
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY dateline DESC LIMIT 0,50' at line 2
Errno.: 1064
Click here to seek help.
狼牙工作室 2011-06-26
  • 打赏
  • 举报
回复
sdf
jackluo2013 2011-06-26
  • 打赏
  • 举报
回复
CREATE TABLE IF NOT EXISTS `uchome_friend` (
`uid` mediumint(8) unsigned NOT NULL DEFAULT '0',
`fuid` mediumint(8) unsigned NOT NULL DEFAULT '0',
`fusername` varchar(15) NOT NULL DEFAULT '',
`dateline` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`uid`,`fuid`),
KEY `fuid` (`fuid`),
KEY `status` (`uid`,`dateline`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CainLai 2011-06-08
  • 打赏
  • 举报
回复
如果你关注的好友很多,同时这些人又都有更新的话,那么好像系统只会显示一部分最新更新的消息,而当你把浏览器的滑动条网下拖的时候,他才会即时的再去读取信息
老潘 2011-06-08
  • 打赏
  • 举报
回复
应该是MySQL和NoSQL结合,MySQL存用户及微博消息,NoSQL存关注、被关注等
Sphonix 2011-06-08
  • 打赏
  • 举报
回复
可以肯定的说,这个不是存储在关系数据库里的,一般都是用的高性能的嵌入式数据库。至于具体的设计结构,应该与普通的关系数据库中的表结构差异不大,但其性能要比关系数据库快很多。不过肯定不是楼主所说的“先查出这10000个用户的ID,再根据这些ID以时间排序获取更新博客内容”这种方式。
阿里瓜瓜 2011-06-07
  • 打赏
  • 举报
回复
哎估计一个表存关系 其他表调用
whb147 2011-03-29
  • 打赏
  • 举报
回复
还有就是分表
whb147 2011-03-29
  • 打赏
  • 举报
回复
如果知道QQ好友是怎么设计的,
原理一样

whb147 2011-03-29
  • 打赏
  • 举报
回复
感觉交叉关注那个表太大了
比如说有10万个用户,如果交叉关注,每个就10个话,就是1000000万
像新浪这样的,那么行记录就太大了
luoyoumou 2011-03-29
  • 打赏
  • 举报
回复
-- 用户表(如果这个表数据相当多,可以用分区表)
create table userinfo
( userid number(38,0), -- 可以用序列递增值也成,自己看着办
username varchar2(60),
phone varchar2(20),
address varchar2(20),
sex char(1),
cdate date default sysdate
-- 其他字段,自己添加
);

alter table userinfo add constraints pk_userinfo primary key(userid);

-- 用户关注信息表(如果这个表数据相当多,可以用分区表):
create table userattention
( userid number(38,0), -- 用户ID
attention_userid number(38,0), -- 被关注的用户ID
status number(18,0), -- 关注状态(或者说关注等级,自己定义:0代表什么,1代表什么)
cdate date default sysdate, -- 创建时间
udate date default sysdate -- 修改时间
-- 其他字段,自己添加
);

-- 为保持数据完整性:不管是“用户ID”还是“被关注的用户ID”其ID必须在userinfo表中存在!
alter table userattention add constraints pk_userattention primary key(userid,attention_userid);
alter table userattention add constraints fk_userattention_userid foreign key (userid) references userinfo(userid);
alter table userattention add constraints fk_userattention_att_userid foreign key (attention_userid) references userinfo(userid);

userattention表中一个userid对应该可能有N条记录(而不像你说的:用一条记录,其不同的attention_userid 用逗号隔开,这样设置是不合理的)

-- 好比QQ号,我的QQ可以添加N个QQ好友,但我想:腾迅应该不会将我这N个QQ好友用字串连成一条记录(这也太吝啬啦)
junhe0723 2011-03-29
  • 打赏
  • 举报
回复
非关系型数据库
anlianganl 2011-01-24
  • 打赏
  • 举报
回复
行至水穷处,坐等云起时。
像这类SNS类型的,应该不是用的关系数据存储,应该是Nosql存储的。
加载更多回复(17)

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧