比如说我有一个像这样的项目表:
ID
------
0
1
2
3
4
表中的每个项目都需要能够“链接”到同一个表中的N个其他项目。因此,例如,项目0可能链接到项目2和项目4.第一个明显的解决方案似乎是将某种类型的数组存储为另一列,并且该数组可以包含整数以“链接”到同一个表中的其他项目。但是,SQL实际上没有数组功能,使用字符串会使特定查询需要更长的时间,因为我必须使用LIKE %%。
所以必须有一些方法可以使用另一个表来存储动态的整数列表。
在SQL中存储此类数据的常规方法是什么?
答案 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->2
,0->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变量非常小心他提到。