代码之家  ›  专栏  ›  技术社区  ›  Brad Cox

为语义网络节点推荐SQL数据模型?

sql
  •  0
  • Brad Cox  · 技术社区  · 15 年前

    我们正在为联邦语义网络(RDF、Protege等)构建一个基于RDBMS的网站。这基本上是一个很大的节点集合,每个节点与其他节点之间都有一个很大且不确定的命名关系集。

    我的第一个想法是为所有节点(名称、描述等)创建一个表,并为每个命名关系添加一个表。有更好的主意吗?

    5 回复  |  直到 15 年前
        1
  •  1
  •   Brad Cox    15 年前

    在进一步的思考中,总共可以使用两个表,一个用于节点(id、name、description),另一个用于关系(id、name、description、from、to),

        2
  •  1
  •   Dries Van Hansewijck    15 年前

    可以通过为每个关系创建2行来优化性能。

    假设你有一个表项和一个表关系,而那个人a和人B有关系,这个关系表有一个左栏和右栏,都指的是项。现在,如果这个关系只有一行,并且您想要某个项的所有关系,那么您将有一个如下所示的查询:

    SELECT * FROM Relations WHERE LeftItemId = @ItemId OR RightItemId = @ItemId
    

    此查询中的或将破坏您的性能!如果要复制行并切换关系(左变右,反之亦然),则查询如下所示:

    SELECT * FROM Relations WHERE LeftItemId = @ItemId 
    

    有了正确的索引,这个索引将非常快。

        3
  •  0
  •   Lucero    15 年前

        4
  •  0
  •   Andomar    15 年前

    如果没有用于节点的单个表,则必须定义许多关系表。每个新的节点类型都需要一个新的关系表 每一个 旧节点类型。很快就会失控的。

    所以一张桌子听起来最好。如果需要特定节点类型的其他字段,则始终可以使用1:1关系来扩展它。

        5
  •  0
  •   Mladen Prajdic    15 年前

    如果您使用的是sql server 2008,则可能需要考虑 HierarchyID datatype 以存储您的层次结构。它是为存储而优化的。