突然想到的一个题,有兴趣的来看看. 如何存储一个有向图/无向图.

三断笛 2011-07-20 02:12:54
论坛上问树型表的问题多了,突然想到,有没有办法在数据库中存储一个图?

定义
  图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
在上面两个图结构中,一个是有向图,即每条边都有方向,另一个是无向图,即每条边都没有方向。

在数据库中怎样存储一个有向图和无向图?
要能够直观,方便,完整地表示顶点与顶点之间的关系.
要有较小的冗余,较小的空间占用.
要能够快速地查询出顶点与顶点之间的关系,能方便地遍历这个图.

100分.纯属讨论研究.
...全文
227 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
三断笛 2011-09-01
  • 打赏
  • 举报
回复
SQL2005/2008技术内幕 T-SQL查询有专门讲树,图这两种数据结构的存储,查询和维护,非常棒,有空转到博客上来.
--小F-- 2011-07-20
  • 打赏
  • 举报
回复
if object_id('[tb]') is not null drop table [tb]
create table [tb] (id int,name varchar(1),pid int)
insert into [tb]
select 1,'A',0 union all
select 2,'B',1 union all
select 3,'D',1 union all
select 4,'C',2 union all
select 5,'D',2 union all
select 6,'A',4 union all
select 7,'E',5 union all
select 8,'F',5
GO
;with cte
as
(
select *,[path]=cast([name]+'->' as varchar(100)) ,[level] = 1 from tb where pid = 0
union all
select a.*, cast(c.[path]+a.[name]+'->' as varchar(100)),[level]+1 from cte c ,tb a where a.pid = c.id
)
select
*
from cte
where len([path]) > 6 and right([path],3) = left([path],3)
/*
id name pid path level
----------- ---- ----------- -------------- -----
6 A 4 A->B->C->A-> 4

(1 行受影响)
*/

------------------------------------------------------------------------
-- Author : happyflystone
-- Date : 2010-04-06
-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
--
------------------------------------------------------------------------

-- Test Data: ta
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
Go
CREATE TABLE tb([cid] NVARCHAR(1),[pid] NVARCHAR(1))
Go
INSERT INTO tb
SELECT 'A','B' UNION ALL
SELECT 'A','D' UNION ALL
SELECT 'B','C' UNION ALL
SELECT 'B','D' UNION ALL
SELECT 'C','A' UNION ALL
SELECT 'D','E' UNION ALL
SELECT 'D','F'
GO
--Start
;with cte
as
(
select *,[path]=cast([cid]+'->' as varchar(100)) ,[level] = 1
from (select distinct cid,cast('' as nvarchar(1)) as pid from tb union select distinct pid ,'' from tb) b
union all
select a.*,cast(a.[cid]+'->'+c.[path] as varchar(100)),[level]+1
from cte c ,tb a
where a.pid = c.cid and charindex(a.[cid]+'->',c.[path])=0
)
select
[path]+cid+'->'
from cte
where exists(select 2 from tb where cid+'->' = right([path],3) and pid+'->' = left([path],3))-- = left([path],3)


--Result:
/*
--------------
A->B->C->A->
C->A->B->C->
B->C->A->B->

(3 行受影响)

*/
--End




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2010/04/06/5456223.aspx
--小F-- 2011-07-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/zjcxc/article/details/2009421
看看老大的乘车路线查询..
aXen 2011-07-20
  • 打赏
  • 举报
回复
使用xml来存储?
liangyong1107 2011-07-20
  • 打赏
  • 举报
回复
CTE递归可实现树形图。。但有向图和无向图没明白什么意思..
快溜 2011-07-20
  • 打赏
  • 举报
回复
无向图也可以用这两张表搞定。查询点的时候,把重复的线过滤掉,或者保存的时候根本就不用保存。
快溜 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xxyj6450 的回复:]
引用 4 楼 ssp2009 的回复:

哈哈,这个题有意思,说下我的想法,
有向图:
点表:id,x,y,关系表id1,id2
无向图还没搞明白啥意思


无向图就是点与点之间有联系,但是无方向,有向图的点与点之间的连接是有方向的.
[/Quote]有向图我说的两个表就可以搞定了,id1起始点id2终止点。id1指向id2
三断笛 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ssp2009 的回复:]

哈哈,这个题有意思,说下我的想法,
有向图:
点表:id,x,y,关系表id1,id2
无向图还没搞明白啥意思
[/Quote]

无向图就是点与点之间有联系,但是无方向,有向图的点与点之间的连接是有方向的.
快溜 2011-07-20
  • 打赏
  • 举报
回复
哈哈,这个题有意思,说下我的想法,
有向图:
点表:id,x,y,关系表id1,id2
无向图还没搞明白啥意思
AcHerat 2011-07-20
  • 打赏
  • 举报
回复
这个楼主可以结合数据结构图的一些算法,用SQL中的递归应该也可以实现。
Varchar 2011-07-20
  • 打赏
  • 举报
回复
sfssfsff
cd731107 2011-07-20
  • 打赏
  • 举报
回复
用在并发事务和锁上的?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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