热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在SQL数据库中存储树-HowtostoreatreeinSQLdatabase

Ihavetostoreatreeinadatabase,sowhatisthebestwaytodothis?Showthemethodyouusean

I have to store a tree in a database, so what is the best way to do this? Show the method you use and name its pros and cons. (I am using SQL Server 2005)

我必须在数据库中存储树,那么最好的方法是什么?显示您使用的方法,并说出它的优缺点(我使用的是SQL Server 2005)。

6 个解决方案

#1


11  

I found the discussion in the SQL Anti-patterns very helpfull, as it also focuses on the drawbacks of every implementation.

我发现SQL反模式中的讨论非常有用,因为它也关注每个实现的缺点。

Also, The slides 48-77 in this presentation reiterate that analisys.

同样,本报告中48-77页的幻灯片重申了analisys。

Bottom line, there is no such thing as a generic tree, and no silver bullet for SQL trees. You'll have to ask yourself about the data, how and how much will they be selected, modified, will branches be moved around, etc, and based on those answers implement a suitable solution.

总之,没有通用树,也没有SQL树的银弹。你必须问问自己关于这些数据的信息,它们会被选择,修改,将会被移动,等等,并且基于这些答案来实现一个合适的解决方案。

#2


7  

try this: Hierarchies (trees) in SQL Server 2005

试试这个:SQL Server 2005中的层次结构(树)

#3


3  

Well, the easiest way would be for a record to have a ParentID column so that it knows which record is its parent. This is a pretty standard practice. For example, an online store might have a hierarchy of product categories. Each category will have a ParentID. Example: The "Jeans" category in an clothing database might have "Pants" as the parent category. It's a bit harder if you want a record to indicate which are its children, unless you restrict the number of children. If you want a binary tree, you could have LeftChildID and RightChildID columns. If you allow any number of children, you could have a Children column with IDs delimited by commas (such as 1,4,72,19) but that will make querying rather hard. If your database allows for array types in columns, you can probably use an array instead of a delimited string, which would be easy to query - but I'm not sure if MS SQL Server supports that or not.

好吧,最简单的方法是记录有一个ParentID列,这样它就知道哪个记录是它的父记录。这是一个相当标准的做法。例如,在线商店可能有产品类别的层次结构。每个类别都有一个父母。例如:服装数据库中的“牛仔裤”类别可能有“裤子”作为父类别。如果你想要一个记录来表明哪个是它的子节点,那就有点困难了,除非你限制了子节点的数量。如果你想要一个二叉树,你可以有LeftChildID和RightChildID列。如果您允许任意数量的子元素,您可以有一个用逗号分隔id的子元素列(例如1,4,72,19),但是这会使查询变得非常困难。如果您的数据库允许在列中使用数组类型,那么您可能可以使用数组而不是带分隔符的字符串,这很容易查询——但我不确定MS SQL Server是否支持这一点。

Other than that, it depends on what kind of data you are modelling, and also what sort of operations you plan to do with this tree.

除此之外,它还取决于您建模的数据类型,以及您打算如何处理这棵树。

#4


2  

http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

I found that a very helpful guide.

我发现那是一本很有帮助的指南。

#5


2  

There are two general approaches

有两种通用方法。

  1. In each record, Store the Id of the parent in a nullable column (the root of the tree has no parent)
  2. 在每个记录中,将父节点的Id存储在一个可空列中(树的根没有父节点)
  3. Use Joe Celko's nested set model technique explained here and (thanks to comment from @onedaywhen), also in what is the original source here
  4. 使用Joe Celko在这里解释的嵌套集模型技术(感谢@onedaywhen的评论),这里的原始源代码也是如此

EDIT: new link for this material is here.

编辑:这个材料的新链接在这里。

Pros and Cons ?? !! you're kidding, right ?!

优点和缺点?! !你在开玩笑,对吧? !

#6


1  

I have done this in the past by storing data as xml in SQL.

我过去通过将数据存储为SQL中的xml来实现这一点。


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
书琳天使_984
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有