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

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

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

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

100分.纯属讨论研究.
...全文
267 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
  • 打赏
  • 举报
回复
用在并发事务和锁上的?
代码下载链接: https://pan.quark.cn/s/23ff226fe24b ### iTest自动化测试工具知识点详解#### 一、iTest自动化测试工具简介iTest是由业界领先测试设备制造商Spirent所研发的一款自动化测试工具。该工具为用户呈现了一个集成化的自动化测试解决方案,借助这一工具,用户能够完成软件及网络测试的编写与自动化执行。iTest不仅适用于专业的测试工程师,对于非测试人员来说,同样是一个功能强大的工具,能够协助他们对网络中的设备和应用进行访问和自动化操作。#### 二、iTest Lite快速入门指南iTest Lite是一款免费提供给用户的版本,其目的是为用户呈现一个简明的iTest产品概览。用户可以从官方网站(www.fanfaresoftware.com)获取并安装iTest Lite。此工具不仅能够支持用户进行软件和网络测试,还能用于对网络上的设备或应用程序进行管理和自动化。#### 三、iTest的工作流程- **主页内容**:在iTest被启动之后,主页内容将展示在右侧,而活动列表则位于左侧。主页上不仅包含欢迎消息,还会提供iTest工作流程的高级图示以及链接到Fanfare社区的入口,用户可以通过论坛帖子、教程视频等资源进一步了解iTest。 - **活动列表**:这是使用iTest功能的推荐起点。活动列表包含以下几个部分: - **连接设备**:一种便捷的方法来验证iTest是否能够连接到测试设备。 - **构建拓扑结构**:在这一步骤中,可以迅速定义一组想要进行测试的设备或应用程序。 - **开发测试用例**:创建一个自动化的测试用例,用于针对任何特定的拓扑结构进行测试。 - **查看测试报告**:访问个人...
代码下载链接: https://pan.quark.cn/s/89ea75840350 STM32微控制器的实时时钟(RTC)作为一个独立的计时单元,能够在系统重启或从休眠状态激活后持续保持时间设置不变。本文将详细探究STM32 RTC的运行机制,涵盖时钟结构图解析以及时间显示的原理。需要明确的是,STM32的RTC模块坐落于备份领域(Backup domain),它借助32.768kHz的辅助晶体振荡器作为时钟供给。在进行RTC编程实践时,务必小心谨慎地处理与RTC相关的寄存器配置。随后,我们将借助RTC时钟结构图展开深入剖析。时钟结构图主要由两大块构成:APB1接口区块与RTC主控单元。APB1接口区块负责对与RTC关联的寄存器进行数据交互,而RTC主控单元内含两个子模块:RTC分频调节模块以及一个32位可变步长计数器。在RTC主控单元内部,有几个关键寄存器是必须掌握的:1. RTC_DIV(RTC分频调节余数寄存器):此寄存器旨在获取超越秒级的更高精度时间(如0.1秒、0.01秒)。该寄存器在数值减至极值后会由硬件自动重置。其数值由RTC_PRL(RTC分频调节装载寄存器)提供,其时钟频率源自RTCCLK。2. RTC_PRL(RTC分频调节装载寄存器):它为RTC_DIV提供重置数值,同时用于设定时钟频率的缩放比例。例如,若晶体振荡器频率为32.768KHz,将RTC_PRL设定为32767,即可得到每秒的计数速率。3. RTC_CNT(RTC计数器寄存器):该寄存器记录秒数,并可用于触发计数器溢出中断。4. RTC_ALR(RTC闹钟寄存器):用于设定闹钟时刻,一旦计数器的数值与闹钟寄存器匹配,并且中断功能已启用,便会引发一个闹钟中断事件。在物理实现层...

22,297

社区成员

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

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