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

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

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

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

100分.纯属讨论研究.
...全文
247 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
用在并发事务和锁上的?
Visual Studio Code 是由微软开发的一款免费、开源、跨平台的现代化轻量级代码编辑器,自发布以来迅速成为全球开发者最受欢迎的工具之一。它结合了编辑器的轻便性和集成开发环境(IDE)的强大功能,支持多种编程语言和开发场景,核心特点: 1. 跨平台支持 可在 Windows、macOS 和 Linux 上运行,保持一致的用户体验。 2. 轻量级与高性能 启动速度快,占用资源少,适合处理大型项目或低配置设备。 3. 智能代码补全 内置 IntelliSense(智能感知),提供代码提示、参数信息、快速修复等功能,支持 JavaScript、TypeScript、Python、C++ 等主流语言。 4. 内置终端 直接在编辑器内打开集成终端(支持 PowerShell、CMD、Bash 等),方便执行命令行操作。 5. 调试工具 内置调试器,支持断点、变量监视、调用堆栈查看等,无需离开编辑器即可调试代码。 6. Git 集成 直接通过侧边栏管理 Git 仓库,支持提交、分支切换、冲突解决等操作。 7. 丰富的扩展生态系统 通过 Extensions Marketplace 可安装数千款插件,扩展功能包括: 语言支持:如 Java、Go、Rust 等。 主与图标:自定义界面风格。 工具集成:如 Docker、Kubernetes、数据库连接等。 效率工具:如 REST Client、Live Server 等。 8. 自定义与主 支持修改键盘快捷键、界面主、文件图标等,打造个性化开发环境。 9. 多光标编辑 按住 Alt(Windows/Linux)或 Option(macOS)点击可添加多个光标,同时编辑多处代码。 10. 远程开发支持 通过 Remote - SSH、Remote - Containers 等扩展,可直接连接远程服务器或开发容器,实现无缝协作。

22,300

社区成员

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

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