3

我正在寻找有关如何对包含一个特殊节点的有向图进行建模的意见。

特殊节点:

  1. 不能有任何边缘通向它。
  2. 无法删除。

当前设计:

表:节点、边。Edges 包含两列;from_node_id 和 to_node_id,每个都引用 Nodes 表中的一条记录。

我没有将特殊节点存储为 Nodes 表中的第一条记录,而是决定根本不为其保留记录,而是将其与任何数据库查询分开构建。在 Edges 表中,NULL 在 from_node_id 列中具有特殊含义,指的是中心节点。

我使用这种设计的动机是我不必担心保护中心节点记录不被删除/修改或在 Edges 表的 to_node_id 列中被引用。这也将自动阻止一条边进出同一个节点。我意识到这种设计有一些缺点,例如无法将 from_node_id 和 to_node_id 设为复合主键,可能还有更多。

我目前倾向于使中心节点成为实际记录并在相关数据库方法中为该节点创建检查。这种设计的最佳方式是什么?

4

1 回答 1

2

在这种情况下,我看到一些反对使用 NULL 的论点。

  1. 如果节点包含实际数据,您将不得不为应用程序中的中心节点硬编码数据。
  2. 如果可以更改中心节点,将会有麻烦。
  3. NULL的通常含义是没有值或值未知。因此,接近提议设计的另一个人可能会发现它不直观。

换句话说,我希望在数据库中为中央节点保留一行。

于 2009-07-24T23:07:42.150 回答