如何在数据库中模拟图形

时间:2018-04-19 22:45:01

标签: python sql django graph rdbms

我有一个模拟课程依赖的网站,如下所示: courses dependencies

我发现network model是最好的模型或我的情况,但我还没有在RDBMS中找到它的任何实现。

  • 我正在使用现在相邻的列表,但在某些情况下存在问题且性能较差。
  • 我读过有关修改过的预订遍历树,但它在tress not graphs中非常有用

那么如何在数据库中模拟图形呢?

1 个答案:

答案 0 :(得分:0)

天真的Django模型可能如下所示:

from django.db import models

class Graph(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()

class Node(models.Model):
    name = models.CharField(max_length=100)
    graph = models.ForeignKey(Graph, on_delete=models.CASCADE)

class Edge(models.Model):
    name = models.CharField(max_length=100)
    graph = models.ForeignKey(Graph, on_delete=models.CASCADE)
    from_node = models.ForeignKey(Node, on_delete=models.CASCADE, related_name="from_node")
    to_node = models.ForeignKey(Node, on_delete=models.CASCADE, related_name="to_node")

这使您可以存储任意图形信息。在您的情况下,节点将是课程,边缘将是依赖项。为了处理这些信息,关系数据库不是一个理想的工具。也许您可以通过查询整个图表来最小化查询,并使用与图形相关的工具处理这些数据,例如: NetworkX

我想指出的这个模型的另一个问题是,通常可以存储从一个图形到另一个图形的边缘。还必须考虑其他与图形相关的属性,如重复边缘或循环。