如何正确设计SQL数据库,以便我可以存储节点和连接到其他节点?

时间:2015-08-26 18:26:36

标签: sql arrays database-design architecture

比如说我有一个像这样的项目表:

  ID
------
  0
  1
  2
  3
  4

表中的每个项目都需要能够“链接”到同一个表中的N个其他项目。因此,例如,项目0可能链接到项目2和项目4.第一个明显的解决方案似乎是将某种类型的数组存储为另一列,并且该数组可以包含整数以“链接”到同一个表中的其他项目。但是,SQL实际上没有数组功能,使用字符串会使特定查询需要更长的时间,因为我必须使用LIKE %%。

所以必须有一些方法可以使用另一个表来存储动态的整数列表。

在SQL中存储此类数据的常规方法是什么?

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试通过many-to-many relationship链接数据库项目。

要在关系型SQL数据库中映射它,您将拥有一个包含节点/项目的表,您可以在其中描述其名称" name"以及他们拥有的任何其他属性:

item_id | name
----------------
0       | test
1       | abcd
2       | node_2
3       | item_3
4       | item_4

然后你会有另一个表映射元素(0->20->4),它描述了图中两个节点之间的连接,如下面的connection表:

connection_id | item_id_1 | item_id_2
--------------------------------------
0             | 0         | 2
1             | 0         | 4

每个连接都有自己的ID,便于编辑,并通过其ID链接到项目。您可以在此表中指定节点之间的任意数量的连接。这映射了一种单向,多对多的关系。您可以使用类似的表将两个不同的实体映射到一起,只需映射ID即可。

例如,您可以运行查询以获取两个连接项的名称,如下所示:

SELECT
    i1.name AS 'item_1_name'
    i2.name AS 'item_2_name'
FROM
    connection AS c
    INNER JOIN items AS i1
        ON i1.item_id = c.item_id_1
    INNER JOIN items AS i2
        ON i2.item_id = c.item_id_2

将返回以下内容:

item_1_name | item_2_name
-------------------------
test        | node_2
test        | item_4

有关设置表的更多详细信息,有一个stackoverflow问题:How to make SQL many-to-many same-type relationship table虽然他关于选择它们的答案很容易受到SQL注入的影响,所以我对PHP变量非常小心他提到。