关于现在的SNS社交网站好友关系数据库

yemingwy 2009-09-26 11:07:47
在做一个项目,关于好友之间的关系,有数据表如下

tUserFriend

用户id 好友id
id uid frienduid
1 1 2
2 1 3
3 5 2
4 5 3
5 6 3
6 6 2

一般来说,如何用户A和B加为好友,数据库中应该有两条记录(就是A和B及B和A的关系)好呢,还是1条好呢?
还有,假如我是用户6,我怎么能知道有哪些用户和我有相同的好友呢,想得到下面的结果
uid samefriend
1 2
5 2
意思是用户1和5和我有共同的2个好友
...全文
834 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
rucypli 2009-09-27
  • 打赏
  • 举报
回复
select id,frienduid
from tuserFriend a
where exists
(select 1 from tuserfriend b where b.uid=6 and a.frienduid=b.frienduid )
xuejie09242 2009-09-27
  • 打赏
  • 举报
回复
第一个问题:

select uid, count(*) as NumSameFriend
from tb a
where exists(select * from tb where uid=6 and frienduid=a.frienduid and uid<>a.uid)
group by a.uid

包含全部朋友的,大于等于uid=6的朋友数

select uid
from tb a
where exists(select * from tb where uid=6 and frienduid=a.frienduid and uid<>a.uid)
group by a.uid
having COUNT(*)=(select count(*) from tb where uid=6)

dawugui 2009-09-27
  • 打赏
  • 举报
回复
两个表。

表一:用户表
id , name
1 a
2 b
3 c
...

表二:好友表
id uid fid
1 1 2
2 1 3
3 2 3

这里只考虑单向,如果考虑双向
id uid fid
1 1 2
2 1 3
3 2 3
4 2 1
5 3 1
6 3 2
...
soft_wsx 2009-09-27
  • 打赏
  • 举报
回复
历害!
ChinaJiaBing 2009-09-27
  • 打赏
  • 举报
回复

declare @tb table (id int,uid int,frienduid int)
insert into @tb select 1,1,2
union all select 2,1,3
union all select 3,5,2
union all select 4,5,3
union all select 5,6,3
union all select 6,6,2
;With china
as
(
select uid,
frienduid=stuff((select ','+ltrim(frienduid) from @tb where uid=a.uid order by frienduid
for xml path('')),1,1,'' )
from @tb a group by uid
)
select * from @tb where uid in (
select uid from china a where frienduid =(select frienduid from china where uid=6 and a.uid<>uid))


id uid frienduid
----------- ----------- -----------
1 1 2
2 1 3
3 5 2
4 5 3

(4 行受影响)

xuejie09242 2009-09-27
  • 打赏
  • 举报
回复
完整的代码及结果:

if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([id] int,[uid] int,[frienduid] int)
insert [tb]
select 1,1,2 union all
select 2,1,3 union all
select 3,5,2 union all
select 4,5,3 union all
select 5,6,3 union all
select 6,6,2 union all
select 7,6,4 union all
select 8,1,4 union all
select 9,7,2 union all
select 10,7,3 union all
select 11,7,4 union all
select 12,7,1

--以下语句为求共同朋友的个数,在求表数据的基础上进行下汇总就可以了
select uid, count(*) as NumSameFriend--[frienduid]--
from tb a
where exists(select * from tb where uid=6 and frienduid=a.frienduid and uid<>a.uid)
group by a.uid

--求包括uid=6的所有朋友,还有其他朋友的Uid
select a.uid
from tb a
left join tb b on (b.uid=6 and a.frienduid=b.frienduid)
where a.uid<>6
group by a.uid
having COUNT(a.uid)>COUNT(b.uid)

--好友完全相同的用户
select a.uid
from tb a
left join tb b on (b.uid=6 and a.frienduid=b.frienduid)
where a.uid<>6
group by a.uid
having COUNT(a.uid)=(select COUNT(1) from tb where uid=6)


uid NumSameFriend
1 3
5 2
7 3

uid
7

uid
1
xuejie09242 2009-09-27
  • 打赏
  • 举报
回复
如果是只求大于的

select a.uid
from tb a
left join tb b on (b.uid=6 and a.frienduid=b.frienduid)
where a.uid<>6
group by a.uid
having COUNT(a.uid)>COUNT(b.uid)

如果要求完全相同的,稍微变化一下

select a.uid
from tb a
left join tb b on (b.uid=6 and a.frienduid=b.frienduid)
where a.uid<>6
group by a.uid
having COUNT(a.uid)=(select COUNT(1) from tb where uid=6)

exists子句相当于上面的表进行内连接,所以用内连接会过滤掉朋友多的那些记录,上面假设同一个uid,其frienduid不重复,严格意义下应该用distinct frienduid。

请各位高手看下有没更高效的方法
yemingwy 2009-09-26
  • 打赏
  • 举报
回复
小F老大的有点问题吧,我要找的是跟uid=6有相同好友的用户
与6有相同的好友的应该是1和5,各有2个
xuejie09242 2009-09-26
  • 打赏
  • 举报
回复
第一个问题,根据情况吧,如果朋友关系是相互的,一条记录就够 了,但好友关系不是相互的,如QQ上的好友关系,A是B的好友,但B不一定是A的好友,这种情况需要记两条记录,否则,一条就够了。如果考虑不对称好友的情况或可能出现不对称情况,则需要用两条记录表示,否则一条就够了。

第二个问题,参考楼上吧。个人以为,LZ的意思,有几个共同好友,但有几个意义不是太大吧,哪些是共同的好友才是主要,不过,看具体需要吧。
--小F-- 2009-09-26
  • 打赏
  • 举报
回复
第一题个人认为1条记录就足够了 可以进行查询
--小F-- 2009-09-26
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2009-09-26 23:34:32
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([id] int,[uid] int,[frienduid] int)
insert [tb]
select 1,1,2 union all
select 2,1,3 union all
select 3,5,2 union all
select 4,5,3 union all
select 5,6,3 union all
select 6,6,2
--------------开始查询--------------------------
select
uid, frienduid as samefrienduid
from
tb
where
id in
(select distinct uid from tb t where exists(select 1 from tb where uid<>t.uid and frienduid=t.frienduid and uid=6))
----------------结果----------------------------
/*uid samefrienduid
----------- -------------
1 2
6 3

(2 行受影响)

*/
--小F-- 2009-09-26
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2009-09-26 23:34:32
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([id] int,[uid] int,[frienduid] int)
insert [tb]
select 1,1,2 union all
select 2,1,3 union all
select 3,5,2 union all
select 4,5,3 union all
select 5,6,3 union all
select 6,6,2
--------------开始查询--------------------------
select
uid, frienduid as samefrienduid
from
tb
where
id in
(select distinct uid from tb t where exists(select 1 from tb where uid<>t.uid and frienduid=t.frienduid and uid=6))
----------------结果----------------------------
/* id uid frienduid
----------- ----------- -----------
1 1 2
5 6 3

(2 行受影响)
*/
bancxc 2009-09-26
  • 打赏
  • 举报
回复
等高手来解答 问题1.
bancxc 2009-09-26
  • 打赏
  • 举报
回复
if object_id('tb') is not null
drop table tb
go
create table tb(id int,uid int,frienduid int)
go

insert into tb
select 1,1,2 union all select
2,1,3 union all select
3,5,2 union all select
4,5,3 union all select
5,6,3 union all select
6,6,2


select uid,frienduid
from tb t
where exists(select 1 from tb where uid<>t.uid and frienduid=t.frienduid and uid=6)
order by frienduid

/* out put
uid frienduid
----------- -----------
1 2
5 2
5 3
1 3
/*
guguda2008 2009-09-26
  • 打赏
  • 举报
回复
第二个问题将好友关系INNER JOIN就可以了
guguda2008 2009-09-26
  • 打赏
  • 举报
回复
应该是一条记录,然后通过某种优化的算法查找用户关系
实验报告 课程名称: 电子商务与信息安全技术 实验项目: 电子商务网站设计 专业班级: 软件 XXXX 班 姓 名: XXXXXX 学 号: XXXXX 实验室号: 综合楼--411 实验组号: 实验时间: 2012-6-10 批阅时间: 2012-6-16 指导教师: XXXXX 成 绩: 1 沈阳工业大学实验报告 (适用计算机程序设计类) 专业班级: 软件 0901 班 学号: XXXXXXX 姓名: XXX 实验名称:简单电子商务网站的设计 1.实验目的: 通过上网搜索成功的中小型电子商务网站,分析网站的体系结构、网站的流 程、网站的营销手段、信息安全手段以及支付方式。利用准备好的资料建立一个 简单的电子商务网站,基本实现简单的网站功能。 2.实验内容: (1) 建立电子商务网站的首页。 (2) 采用 2 种以上的营销手段。 (3) 设计网站的流程。 (4) 开发网站的各个模块功能。 3. 实验方案(程序设计说明) (1) 设计首页布局 (2) 设计网站的功能模块并实现链接 (3) 采用信息安全手段实现电子支付 4. 实验步骤或程序(经调试后正确的源程序) (见附件 A) 2 附录 A 题目:简单电子商务网站设计 组员:XXXXX 一、网站开发的背景和意义 电子商务发展至今已逐渐成熟, 各种电商网站层出不穷, 每个网站都有种 "似 曾相识"的感觉,网站的竞争大多趋于实体店的价格战模式,这种竞争只会降低 利润,对整个行业产生不利影响。鉴于如此,我们应该找出电子商务网站的下一 个引爆点,我觉得它便是电子商务的社区化。 电子商务翻译自 e-commerce, 而现在 "s-commerce——社区化电子商务" 又 占领了高地。就像 Web2.0 贡献出的最大惊喜——社交网络一样,社会化电子商 务强调的也将是"基于关系的传播" 。 先来看看社交网络在忙些什么吧。国内的人人网、开心网利用自有的庞大用 户群相继开辟团购战场;Facebook 在 2 月 4 日正式推出了有关 Facebook 信用币 (Credits)的新功能——社交团购。 该功能允许用户在游戏中购买虚拟商品后, 有 权将相应商品的折扣分享给他的好友。目前虽只是针对虚拟产品的交易,但如果 推广到线下的实物交易,将有可能成为团购网站的杀手。而 SNS 之所以开始忙 着染指电子商务,也是在不断挖掘用户价值。它的优势在于拥有庞大的用户群, 并且每个用户都可以成为传播管道,SNS 网站需要做的就是进行上游资源的批 发。 社交网络已看到了电子商务的巨大蛋糕,在这样一个关键时刻,电子商务网 站应采取有效措施来对抗 SNS 网站。搭建社区便是一个好的方法,电子商务要 放大用户的声音, 一条切实可行的途径就是为他们搭建交流的平台。每个人都有 分享购物成果的渴望,同时也有寻找心仪商品的需要。在这个过程中,通过人际 关系网进行的信息传播其实就相当于商品导购。因此,我们设计的网站为用户提 供了社区化的交流功能,这也是我们设计的重点。我坚信,社区化将是电子商务 网站的下一个浪潮! 二、网站的开发流程 1.网站前期规划 (1)确立网站主题 本网站以销售数码产品及电脑配件为主。 (2)确定网站功能设计 本网站参照淘宝网等成熟模型设计功能,并加入社区化这一特色。 2.数据库设计 电子商务是以数据库技术和网络技术为支撑的,其中数据库技术是核心。本 网站采用 SQL Sever2000 设计数据库。 3.页面编辑与调试 本网站采用 ASP.NET 技术设计网站, 利用 DreamWeaver 和 PhotoShop 等工具 进行页面、图片的美化与编辑。 4.网站测试 3 (1)检查结果与设计方案是否吻合 (2)在多个浏览器内进行检测 (3)验证链接 (4)评估下载速度 5.网站发布 三、网站开发的技术 1.Browser/Server 体系 B/S 结构的软件是相对传统的 C/S 结构而言的。 C/S 结构将程序分为两部分, 一部分是由多个用户共享的信息与功能,这部分称为服务器端;另一部分是为每 一个用 户所专用,称为客户端。C/S 结构应该具有这样的特征:客户端、服务器 端都安装相应的软件,客户端、服务器端各完成相应的计算工作,服务器端保存 数据库。 而 B/S 结构应该具有如下特征:服务器端都安装相应的软件,客户端不 安装任何软件(不需要维护)。 客户端运行程序是靠浏览器软件(如 IE ,Netscape 等) 登陆服务器进行的。客户端在浏览器里完成一定的计算任务。 2.ASP.NET 技术 本网站没有采用 ASP 技术,采用的是 ASP.NET 技术。相比 ASP 技术, ASP.NET 弥补了其诸多不足,比如意大利面型的程序开发方法,让维护的难度 提高很多,尤其是大型的 ASP 应用程序。
互联网金融与大数据 互联网对金融的变革,总体上来说,可以分为两局部:互联网思想和互联网技术,这两 者类似世界观和方法论的关系,是互相辅佐和渗透的。   互联网技术从深层次具体化的角度解读可以分为:大数据、P2P人人组织网络和两面 市场。其中大数据是最重要的因素之一。金融没有类似实物的物理生产、仓储、物流等 过程,但其本身是数据的生产、仓储、挖掘、传输、分析和集成。所以大数据对于金融 而言,相比其他行业,无疑是有更巨大的影响力。   大数据,是思维、技术与数据的三足鼎立。大数据不仅指规模庞大的数据,它首先 是一种思维方式的变化,其次是对这些数据的处理和应用,是数据、处理技术与应用三 者的统一的一列处理技术,最后,大数据的前提必然是充裕互通的数据本身。   大数据的思维方式会改变传统金融作业思维,它首先是会改变金融信贷业的抵押文 化,推动信用变现成为可能和主流。尤其是中国金融行业,有着根深蒂固的抵押文化, 在贷款的过程中严重依赖于抵押物,这是中小企业得不到贷款效劳的很重要原因。抵押 文化让贷款效劳提供方在考量时思维变得简单粗暴。贷款方的考量核心是判断抵押物品 的价值,确保有相应的价值空间。比方房产价值 200 万,那么打个 7 折,只要保证价值不下跌太厉害,那么就不会产生风险。房价不下跌,风险不大;房价 下跌,也是国家的事情,与银行机构无关。   长期而言,抵押文化对金融业开展有相当负面的影响。要想做到真正的改变就是要 强化信用贷款,建立信用机制。真正的平安不是抵押物,而是人们的信用。我们讲大数 据对金融影响,首先要有思维上的认识变化。   信用看不见,摸不着,但大数据的方式可以帮助复原一个人,甚至一群人的信用轮 廓,让个人或者群体的信用变得金光灿灿,触手可及。这将是根本性的改变,并产生巨 大的影响。大数据的应用例子中,对于天气预报的实践是人们津津乐道的——没有人可以 准确地预测天气,因为变量太多,大到日月星展,中到洋流大气,小到人的环境行为的 偶然因素,都会对其产生影响,但气象学家通过气象大数据的分析,加上并行的处理技 术,人们做到了从数据中找到规律,实现更准确的气象预测。   个人的信用评估和实现气象预测有非常类似之处,一个人或者群体的信用好坏取决 于很多的变量,而且信用本身不是静态的,而是一个动态的行为特征的表达——资产、收 入、消费、个性、习惯、社交网络等等都是会对信用产生影响。个体信用正式通过各种 行为决定的,但是表达一个人的信用的行为并非是全无规律的。通过大数据,可以很好 地通过对个体或者群体的大量信用行为进行收集、整理、分析,只要把这些糅合在一起 时,会发现很多客观规律,使得人的信用立体化,从而实现对于个体或群体信用的预计 。   互联网技术革新本身也推动了大数据成为可能。云计算、SNS、移动互联网等技术的 开展,使得大量数据的生产和连通变成现实;非结构化数据库技术的开展,使得数据收 集的要求大大降低;存储技术的开展,使得大规模数据存储得以实现;并行处理计算, 使得数据可以得到高速处理,更快获得结果、应用;各种算法、机器智能化学习的成熟 等等又进一步促进大数据的应用开展。所以,我们可以做到存储处理所有数据,而不是 存储抽样数据,并且可以将粒度从整体面向个体。这些也带来一系列变革:   市场集中度更高。IT 技术的开展、互联网的延伸、大数据的应用,让市场摆脱了地域的限制,从而使得更大 规模的企业以更快的速度成长。而大数据在技术上的突破也会使得马太效应更加明显—— 强者愈强,大者愈大。如果我们还是局限于地域优势,无法有效形成对海量用户和良好 的数据资产的管理,那么未来核心竞争力将会受到严重削弱。  促进金融的开放性,大数据首先要数据全量在线。现在太多系统都是孤立的,比方很 多公共事业数据,即使银行本身的很多业务,比方对公业务、对私业务、卡业务等都是 相互别离的难以形成联动效应;况且决定信用本身的不单是金融数据,很多其他领域的 数据也会产生影响,这对于数据的开放性要求更高。但这些数据都可以借助互联网进行 联通,互联网有天生的开放性、透明性,使得大数据的应用有了可能。传统的金融业也 必然会因此而变化。   最后,还是数据本身。既然是大数据,必须要有足够的大量数据,这是一切预测的 大前提。如何在预测之前收集足够多的信息,就成了预测成功与否的关键。   一切皆可"量化〞,并在加速量化,几十年来 IT 技术的开展已经使得大量数据量化。   互联网金融对大数据的使用,天生具有优势。互联网可以在法律和道德所容许的范 围内捕捉信用评估所需要的个人或群体的行为信息,并将这些繁杂的信息提供应大数据 作业系统进行处理,完成对个人或群体的信用价值的评估分析。从这个角度来说,P2P 在对信用大数据的使用方面更有独特优势,由于 P2P 两面市场的特

34,575

社区成员

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

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