热门标签 | 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来实现这一点。


推荐阅读
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 深入解析MySQL中的回表查询与索引覆盖技术
    在MySQL中,回表查询与索引覆盖技术是优化查询性能的重要手段。回表查询是指当使用非聚集索引进行查询时,由于非聚集索引的B-Tree叶子节点中仅存储了对应行数据的主键值,因此需要通过主键再次访问聚簇索引来获取完整数据记录。而索引覆盖则是在查询所需的所有列都包含在某个索引中,从而避免了额外的回表操作,显著提高了查询效率。本文将深入探讨这两种技术的原理及其应用场景,帮助读者更好地理解和优化MySQL查询性能。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 二叉树的直径是指树中任意两个叶节点之间最长路径上的节点数量。本文深入解析了计算二叉树直径的算法,并提出了一种优化方法,以提高计算效率和准确性。通过详细的案例分析和性能对比,展示了该优化算法在实际应用中的优势。 ... [详细]
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社区 版权所有