Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
94.5k views
in Technique[技术] by (71.8m points)

sql - 在关系数据库中存储分层数据有哪些选择? [关闭](What are the options for storing hierarchical data in a relational database? [closed])

Good Overviews

(良好的概述)

Generally speaking, you're making a decision between fast read times (for example, nested set) or fast write times (adjacency list).

(一般来说,您要在快速读取时间(例如,嵌套集)或快速写入时间(邻接列表)之间做出决定。)

Usually, you end up with a combination of the options below that best fit your needs.

(通常,您最终会得到以下最适合您的选项的组合。)

The following provides some in-depth reading:

(下面提供一些深入的阅读:)

Options

(选件)

Ones I am aware of and general features:

(我知道的和一般功能:)

  1. Adjacency List :

    (邻接表 :)

    • Columns: ID, ParentID

      (列:ID,ParentID)

    • Easy to implement.

      (易于实现。)

    • Cheap node moves, inserts, and deletes.

      (廉价节点移动,插入和删除。)

    • Expensive to find the level, ancestry & descendants, path

      (昂贵的查找级别,祖先和后代,路径)

    • Avoid N+1 via Common Table Expressions in databases that support them

      (在支持N + 1的数据库中通过公用表表达式避免N + 1)

  2. Nested Set (aka Modified Preorder Tree Traversal )

    (嵌套集 (又名修改后的预排序树遍历 ))

    • Columns: Left, Right

      (列:左,右)

    • Cheap ancestry, descendants

      (廉价祖先,后裔)

    • Very expensive O(n/2) moves, inserts, deletes due to volatile encoding

      (由于易失性编码,非常昂贵的O(n/2)移动,插入,删除)

  3. Bridge Table (aka Closure Table /w triggers )

    (桥接表 (又名闭包表/ w触发器 ))

    • Uses separate join table with: ancestor, descendant, depth (optional)

      (使用单独的联接表,并带有:祖先,后代,深度(可选))

    • Cheap ancestry and descendants

      (便宜的祖先和后裔)

    • Writes costs O(log n) (size of subtree) for insert, updates, deletes

      (写入成本O(log n) (子树的大小)以进行插入,更新,删除)

    • Normalized encoding: good for RDBMS statistics & query planner in joins

      (标准化编码:适合联接中的RDBMS统计和查询计划程序)

    • Requires multiple rows per node

      (每个节点需要多行)

  4. Lineage Column (aka Materialized Path , Path Enumeration)

    (沿袭列 (又名物化路径 ,路径枚举))

    • Column: lineage (eg /parent/child/grandchild/etc...)

      (栏:沿袭(例如/ parent / child / grandchild / etc ...))

    • Cheap descendants via prefix query (eg LEFT(lineage, #) = '/enumerated/path' )

      (通过前缀查询的廉价后代(例如, LEFT(lineage, #) = '/enumerated/path' ))

    • Writes costs O(log n) (size of subtree) for insert, updates, deletes

      (写入成本O(log n) (子树的大小)以进行插入,更新,删除)

    • Non-relational: relies on Array datatype or serialized string format

      (非关系:依赖于数组数据类型或序列化的字符串格式)

  5. Nested Intervals

    (嵌套间隔)

    • Like nested set, but with real/float/decimal so that the encoding isn't volatile (inexpensive move/insert/delete)

      (类似于嵌套集,但具有实数/浮点数/十进制数,因此编码不会不稳定(廉价的移动/插入/删除))

    • Has real/float/decimal representation/precision issues

      (有实数/浮点数/小数表示/精度问题)

    • Matrix encoding variant adds ancestor encoding (materialized path) for "free", but with added trickiness of linear algebra.

      (矩阵编码变体为“自由”添加了祖先编码(物化路径),但增加了线性代数的技巧。)

  6. Flat Table

    (平面桌)

    • A modified Adjacency List that adds a Level and Rank (eg ordering) column to each record.

      (修改后的邻接表,将“级别”和“等级”(例如,排序)列添加到每个记录。)

    • Cheap to iterate/paginate over

      (便宜地迭代/分页)

    • Expensive move and delete

      (昂贵的移动和删除)

    • Good Use: threaded discussion - forums / blog comments

      (很好的用途:主题讨论-论坛/博客评论)

  7. Multiple lineage columns

    (多个谱系列)

    • Columns: one for each lineage level, refers to all the parents up to the root, levels down from the item's level are set to NULL

      (列:每个谱系级别都有一列,指的是直到根目录的所有父级,从项的级别向下的级别都设置为NULL)

    • Cheap ancestors, descendants, level

      (廉价祖先,后代,等级)

    • Cheap insert, delete, move of the leaves

      (便宜的插入,删除,移动叶子)

    • Expensive insert, delete, move of the internal nodes

      (内部节点的昂贵插入,删除,移动)

    • Hard limit to how deep the hierarchy can be

      (严格限制层次结构的深度)

Database Specific Notes

(数据库特定说明)

MySQL

(的MySQL)

Oracle

(甲骨文)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
by (100 points)
Эскорт сопровождение - это услуга, которая предоставляется женщинами и мужчинами,
которые сопровождают своих клиентов на различные мероприятия или путешествия. Они могут быть наняты для
проведения времени вместе, общения, поддержки и даже интимных отношений.
Обратитесь к услугам эскорта моделей в Москве - <a href=http://eskortmoskva.ru/>эскорт москва.</a>
by (100 points)
Эскорт сопровождение - это услуга, которая предоставляется женщинами и мужчинами,
которые сопровождаЭскорт сопровождение - это услуга, которая предоставляется для обеспечения безопасности и комфорта клиентов
во время их пребывания в незнакомом городе или стране. Эскорт сопровождающий обычно является опытным профессионалом,
который знает все тонкости и особенности местной культуры и может помочь клиенту чувствовать себя уверенно и защищенно- <a href=https://teletype.in/@glopert/cCN4JJIH8XE>эскорт москва.</a>
by (100 points)
Эскорт сопровождение - это услуга, которая предоставляется женщинами и мужчинами,
которые сопровождаЭскорт сопровождение - это услуга, которая предоставляется для обеспечения безопасности и комфорта клиентов
во время их пребывания в незнакомом городе или стране. Эскорт сопровождающий обычно является опытным профессионалом,
который знает все тонкости и особенности местной культуры и может помочь клиенту чувствовать себя уверенно и защищенно- <a href=https://teletype.in/@glopert/Klbr5VVGQkl>эскорт в москве</a>
by (100 points)
В поисках идеального кондиционера в Кишиневе, столице Молдовы, вам доступно множество вариантов. Город обладает развитой инфраструктурой и многочисленными магазинами, предлагающими широкий выбор кондиционеров различных марок и моделей. Для удобства выбора и покупки, рассмотрим несколько популярных вариантов:
 
Специализированные магазины по продаже бытовой техники: В Кишиневе существует множество магазинов, специализирующихся на продаже бытовой техники, включая кондиционеры. Здесь вы сможете получить профессиональную консультацию от продавцов и выбрать подходящий кондиционер для ваших потребностей.
 
Интернет-магазины: В сети интернет также предоставляется широкий выбор кондиционеров с возможностью сравнения характеристик и цен. Многие интернет-магазины осуществляют доставку в Кишинев, что делает процесс покупки более удобным.
 
Специализированные магазины по климатической технике: В городе действуют магазины, специализирующиеся исключительно на климатической технике. Здесь вы найдете большой ассортимент кондиционеров различных типов – от оконных до сплит-систем.
 
Большие розничные сети: Некоторые крупные розничные сети также предлагают разнообразные варианты кондиционеров. Эти магазины часто предоставляют гарантии на продукцию и могут предложить дополнительные услуги, такие как монтаж и обслуживание.
 
Перед покупкой рекомендуется провести небольшое исследование рынка, сравнить цены и отзывы о конкретных моделях. Независимо от выбранного варианта, важно обратить внимание на квалификацию продавцов и гарантии, предоставляемые на приобретаемое оборудование.
https://crewshop.md
by (100 points)
В поисках идеального кондиционера в Кишиневе, столице Молдовы, вам доступно множество вариантов. Город обладает развитой инфраструктурой и многочисленными магазинами, предлагающими широкий выбор кондиционеров различных марок и моделей. Для удобства выбора и покупки, рассмотрим несколько популярных вариантов:
 
Специализированные магазины по продаже бытовой техники: В Кишиневе существует множество магазинов, специализирующихся на продаже бытовой техники, включая кондиционеры. Здесь вы сможете получить профессиональную консультацию от продавцов и выбрать подходящий кондиционер для ваших потребностей.
 
Интернет-магазины: В сети интернет также предоставляется широкий выбор кондиционеров с возможностью сравнения характеристик и цен. Многие интернет-магазины осуществляют доставку в Кишинев, что делает процесс покупки более удобным.
 
Специализированные магазины по климатической технике: В городе действуют магазины, специализирующиеся исключительно на климатической технике. Здесь вы найдете большой ассортимент кондиционеров различных типов – от оконных до сплит-систем.
 
Большие розничные сети: Некоторые крупные розничные сети также предлагают разнообразные варианты кондиционеров. Эти магазины часто предоставляют гарантии на продукцию и могут предложить дополнительные услуги, такие как монтаж и обслуживание.
 
Перед покупкой рекомендуется провести небольшое исследование рынка, сравнить цены и отзывы о конкретных моделях. Независимо от выбранного варианта, важно обратить внимание на квалификацию продавцов и гарантии, предоставляемые на приобретаемое оборудование.
https://www.webwiki.com/jara.md
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

My favorite answer is as what the first sentence in this thread suggested.

(我最喜欢的答案是该线程的第一句话建议的内容。)

Use an Adjacency List to maintain the hierarchy and use Nested Sets to query the hierarchy.

(使用邻接列表维护层次结构,并使用嵌套集查询层次结构。)

The problem up until now has been that the coversion method from an Adjacecy List to Nested Sets has been frightfully slow because most people use the extreme RBAR method known as a "Push Stack" to do the conversion and has been considered to be way to expensive to reach the Nirvana of the simplicity of maintenance by the Adjacency List and the awesome performance of Nested Sets.

(迄今为止的问题是,从邻接表到嵌套集的掩盖方法非常慢,因为大多数人使用称为“推栈”的极端RBAR方法进行转换,并被认为是昂贵的方法通过邻接表和嵌套集的出色性能达到维护简单性的必杀技。)

As a result, most people end up having to settle for one or the other especially if there are more than, say, a lousy 100,000 nodes or so.

(结果,大多数人最终不得不适应一个或另一个,特别是如果存在超过100,000个左右的糟糕节点。)

Using the push stack method can take a whole day to do the conversion on what MLM'ers would consider to be a small million node hierarchy.

(使用推栈方法可能需要一整天的时间来完成MLM'ers认为只有一百万个节点层次结构的转换。)

I thought I'd give Celko a bit of competition by coming up with a method to convert an Adjacency List to Nested sets at speeds that just seem impossible.

(我以为我想出一种方法,以一种似乎不可能的速度将“邻接表”转换为“嵌套”集,从而给Celko带来一些竞争。)

Here's the performance of the push stack method on my i5 laptop.

(这是我的i5笔记本电脑上推入堆栈方法的性能。)

Duration for     1,000 Nodes = 00:00:00:870 
Duration for    10,000 Nodes = 00:01:01:783 (70 times slower instead of just 10)
Duration for   100,000 Nodes = 00:49:59:730 (3,446 times slower instead of just 100) 
Duration for 1,000,000 Nodes = 'Didn't even try this'

And here's the duration for the new method (with the push stack method in parenthesis).

(这是新方法的持续时间(括号内为推栈方法)。)

Duration for     1,000 Nodes = 00:00:00:053 (compared to 00:00:00:870)
Duration for    10,000 Nodes = 00:00:00:323 (compared to 00:01:01:783)
Duration for   100,000 Nodes = 00:00:03:867 (compared to 00:49:59:730)
Duration for 1,000,000 Nodes = 00:00:54:283 (compared to something like 2 days!!!)

Yes, that's correct.

(对,那是正确的。)

1 million nodes converted in less than a minute and 100,000 nodes in under 4 seconds.

(在不到一分钟的时间内转换了100万个节点,在不到4秒的时间内转换了100,000个节点。)

You can read about the new method and get a copy of the code at the following URL.

(您可以阅读有关新方法的信息,并在以下URL上获得代码的副本。)

http://www.sqlservercentral.com/articles/Hierarchy/94040/

(http://www.sqlservercentral.com/articles/Hierarchy/94040/)

I also developed a "pre-aggregated" hierarchy using similar methods.

(我还使用类似的方法开发了“预汇总”层次结构。)

MLM'ers and people making bills of materials will be particularly interested in this article.

(传销员和制作物料清单的人员将对本文特别感兴趣。)

http://www.sqlservercentral.com/articles/T-SQL/94570/

(http://www.sqlservercentral.com/articles/T-SQL/94570/)

If you do stop by to take a look at either article, jump into the "Join the discussion" link and let me know what you think.

(如果您确实停下来看任何一篇文章,请跳至“加入讨论”链接,让我知道您的想法。)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...