【问题标题】:Most appropriate data structure for an ordered list in an RDBMS?最适合 RDBMS 中有序列表的数据结构?
【发布时间】:2009-06-25 10:43:20
【问题描述】:

我在 MySQL 数据库中存储了数百万个项目的有序列表。合理地经常需要从列表中添加或删除项目;同样,必须确定项目在列表中的位置。我会说读/写比率约为50:50。

从链表模型开始,我阅读了 [1] 以及那里讨论的各种模型。对于严格的链表,邻接表模型可以正常工作,但由于读/写比率或多或少相等,我采用了使用标准连续列表的分而治之的方法:

将整个列表划分为近似长度的“桶”(例如~10000),维护桶大小的索引及其在主列表中的相对位置。每个项目都分配给特定的存储桶并跟踪其在该存储桶中的位置。

使用这种方法,项目的位置是通过将列表中位于该项目的存储桶之前的存储桶的大小相加,然后将该项目的位置添加到其自己的存储桶中来确定的。要从列表中插入/删除项目,所产生的项目的“移动”被本地化到正在添加或删除项目的桶中;该存储桶的大小也必须相应更新。

这种方法存在一些非规范化(存储桶大小),它本质上不是线程安全的,即使对于事务也是如此,因为在删除/插入期间,必须查询项目表以确定项目的存储桶位置被修改,然后更新以对该项目的存储桶中的所有其他项目执行“转移”。除非这些操作是原子的(可能是通过存储过程?),否则线程会一直死锁。

有没有更合适的方法将此类数据保存在 RDBMS 中?线程安全问题让我很头疼,感觉应该有比强迫我使用存储过程更好的方法来解决这个问题。

非常感谢, 马特。

[1]Database Structure for Tree Data Structure

【问题讨论】:

    标签: mysql database-design data-structures html-lists


    【解决方案1】:

    如果你需要一个链表(不是层次结构),你可以使用我博客中这篇文章中描述的方法:

    ,用这个简单的查询:

    SELECT  @r AS _parent,
            @r := (
            SELECT  id
            FROM    t_list
            WHERE   parent = _parent
            ) AS id
    FROM    (
            SELECT  @r := 0
            ) vars,
            t_list
    

    确保您的 idparent 定义了 UNIQUE 索引以提高效率。

    @r := 0 替换为@r := @id_of_record_to_start_with 以从任何给定的id 开始浏览。

    要找出项目的位置,只需反转查询:

    SELECT  COUNT(*)
    FROM    (
            SELECT  @r AS _id,
                    @r := (
                    SELECT  parent
                    FROM    t_list
                    WHERE   id = _id
                    ) AS id
            FROM    (
                    SELECT  @r := @item_id
                    ) vars,
                    t_list
            ) q
    

    【讨论】:

    • 如果这是一个链表,'parent'实际上是'previous',不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多