如何正确设计 SQL 数据库以便我可以存储节点和与其他节点的连接?
How do I properly design a SQL database so that I can store nodes and connections to other nodes?
例如,我有 table 个像这样的项目:
ID
------
0
1
2
3
4
并且 table 中的每个项目都需要能够 'link' 到相同 table 中的 N 个其他项目。因此,例如,项目 0 可能 link 到项目 2 和项目 4。第一个明显的解决方案似乎是将某种数组存储为另一列,并且该数组可以包含 'link' 到另一个的整数table 中的项目。但是 SQL 并没有真正的数组功能,使用字符串会使执行特定查询需要更长的时间,因为我必须使用 LIKE %%.
所以必须有一些方法可以使用另一个 table 来存储动态整数列表。
在 SQL 中存储此类数据的正常方法是什么?
您似乎正试图通过 many-to-many relationship.
link 数据库项目
要将其映射到关系 SQL 数据库中,您将有一个 table 包含您的 nodes/items,您可以在其中描述它们的 "name" 以及它们的任何其他属性有:
item_id | name
----------------
0 | test
1 | abcd
2 | node_2
3 | item_3
4 | item_4
然后你会有另一个table映射元素(0->2
,0->4
)在一起,它描述了图中两个节点之间的连接,如下connection
table:
connection_id | item_id_1 | item_id_2
--------------------------------------
0 | 0 | 2
1 | 0 | 4
每个连接都有自己的 ID 以便于编辑,并且它 link 通过它们的 ID 连接到项目。您可以在此 table 中指定任意数量的节点之间的连接。这映射了一种单向、多对多的关系。您可以使用类似的 table 将两个不同的实体映射在一起,只需映射 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
return 以下内容:
item_1_name | item_2_name
-------------------------
test | node_2
test | item_4
有关设置 tables 的更多详细信息,有这个 Whosebug 问题:How to make SQL many-to-many same-type relationship table 尽管他关于选择它们的回答容易受到 SQL 注入的攻击,所以我'请务必小心他提到的 PHP 个变量。
例如,我有 table 个像这样的项目:
ID
------
0
1
2
3
4
并且 table 中的每个项目都需要能够 'link' 到相同 table 中的 N 个其他项目。因此,例如,项目 0 可能 link 到项目 2 和项目 4。第一个明显的解决方案似乎是将某种数组存储为另一列,并且该数组可以包含 'link' 到另一个的整数table 中的项目。但是 SQL 并没有真正的数组功能,使用字符串会使执行特定查询需要更长的时间,因为我必须使用 LIKE %%.
所以必须有一些方法可以使用另一个 table 来存储动态整数列表。
在 SQL 中存储此类数据的正常方法是什么?
您似乎正试图通过 many-to-many relationship.
link 数据库项目要将其映射到关系 SQL 数据库中,您将有一个 table 包含您的 nodes/items,您可以在其中描述它们的 "name" 以及它们的任何其他属性有:
item_id | name
----------------
0 | test
1 | abcd
2 | node_2
3 | item_3
4 | item_4
然后你会有另一个table映射元素(0->2
,0->4
)在一起,它描述了图中两个节点之间的连接,如下connection
table:
connection_id | item_id_1 | item_id_2
--------------------------------------
0 | 0 | 2
1 | 0 | 4
每个连接都有自己的 ID 以便于编辑,并且它 link 通过它们的 ID 连接到项目。您可以在此 table 中指定任意数量的节点之间的连接。这映射了一种单向、多对多的关系。您可以使用类似的 table 将两个不同的实体映射在一起,只需映射 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
return 以下内容:
item_1_name | item_2_name
-------------------------
test | node_2
test | item_4
有关设置 tables 的更多详细信息,有这个 Whosebug 问题:How to make SQL many-to-many same-type relationship table 尽管他关于选择它们的回答容易受到 SQL 注入的攻击,所以我'请务必小心他提到的 PHP 个变量。