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


推荐阅读
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • MongoDB集群配置:副本集与分片详解
    本文详细介绍了如何在MongoDB中配置副本集(Replica Sets)和分片(Sharding),并提供了具体的步骤和命令,帮助读者理解并实现高可用性和水平扩展的MongoDB集群。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
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社区 版权所有