【问题标题】:How do I store URL fragments in a database?如何将 URL 片段存储在数据库中?
【发布时间】:2011-02-23 22:00:15
【问题描述】:

如何将 URL(片段)存储在关系数据库中?

在以下 URL 片段中:

 ~/house/room/table

它列出了一个表的所有信息,也许还有一些关于该表的信息。

这个片段:

~/house

输出:Street 13Room, Garage, Garden

~/house/room

输出:My roomChair, Table, Window

数据库架构是什么样的?如果我将house 重命名为flat 会怎样?

可能的解决方案

我在想我可以为 URL 创建一个哈希并将其与parentID 和信息一起存储。如果我重命名某个上层段,则需要更新包含给定段的所有行。

然后我想将每个段连同信息及其级别一起存储:

SELECT FROM items WHERE key=house AND level=1 AND key=room AND level=2

如果网址可以任意深,我该如何解决这个问题?

【问题讨论】:

    标签: mysql database url hierarchy


    【解决方案1】:

    检查 Joe Celko 的树和智者用 SQL 中的层次结构中描述的 邻接列表模型嵌套集模型

    您应该找到有关此主题的大量信息。一篇文章是here


    更新

    嵌套集模型非常适合您寻找“检索单一路径”之类的任务。你所拥有的是'查找节点的直接下属'。这里邻接列表模型更好。

    | id | p_id | name  |
    |  1 | null | root  |
    |  2 |    1 | nd1.1 |
    |  3 |    2 | nd1.2 |
    |  4 |    1 | nd2.1 |
    

    SQL 获取带有片段名称的行及其直接子项。

    SELECT
      p.name,
      GROUP_CONCAT(
        c.name
        SEPARATOR '/'
      ) AS subList
    FROM _table p
    INNER JOIN _table c
      ON p.id = c.p_id
    WHERE p.name = 'root'
    

    附:更喜欢WHERE p.id = 1。 ID 是唯一的,因为名称可能不明确。

    有关更多语法细节,请参阅 MySQL GROUP CONCAT 函数。

    【讨论】:

    • 谢谢,我读了那篇文章。但是,我没有得到的是如何找出哪些行对应于“/house/room/table”..?如果有另一条路径,比如“/house/garage/table”怎么办?有两张不同的桌子,因为它们在不同的地方......
    • @Lars:我喜欢的例子是“/electronics/televisions/lcd”...”
    • 对不起,我不明白。他有一排,想要通往它的道路。我有一条路,想要一行。
    • 如果您选择了片段,您可以将它们连接到一个列表中。 MySQL 中的 GROUP_CONCAT 或 Oracle 中的 LISTAGG 是想法......
    • 如果我的 URL 有 10 个片段,我必须查询数据库 10 次吗?因为,起初,我只有 URL..?
    猜你喜欢
    • 2019-08-10
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2016-10-20
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多