假设我有两套
Set 1: A, B, C
Set 2: X, Y, Z
当元素B
被访问时,我们还应该检索A
和C
以及B
,Set 1
中的其他元素
我可以通过排列每个集合,为集合的每个元素在哈希表中创建一个条目,并存储/复制该集合中可用的所有值来实现这一点,例如;
A: A, B, C
B: A, B, C
C: A, B, C
但这会带来内存成本,并且对于大型数据集来说可能会变得效率低下。我试图在不使用图形数据库的情况下实现这一点。数据存储在MySQL中。有什么建议吗?
例如,对于每个数据行,您可以在数据库中的数据集中存储指向元素标识符的指针(或者元素的抽象"对"的标识符(如果您将使用第二种方式,则这些标识符在数据库中并不实现)。然后,在PHP中,您应该构建这样一个数组:
array(
'id1' => array(
'value' => 'A',
'links' => array('id2', 'id3')
),
'id2' => array(
'value' => 'B',
'links' => array('id1', 'id3')
),
'id3' => array(
'value' => 'C',
'links' => array('id1', 'id2')
)
);
或者,你可以用一个标识符标记(A,B,C),然后得到这样的数组:
array(
'couples' => array(
'c1' => array('id1', 'id2', 'id3')
),
'values' => array(
'id1' => array(
'value' => 'A',
'links' => array('c1')
),
'id2' => array(
'value' => 'B',
'links' => array('c1')
),
'id3' => array(
'value' => 'C',
'links' => array('c1')
)
)
);
然后,只需编写一个简单的函数来获取所有链接的元素。在第一种情况下,您必须在links
上循环,并通过当前键从当前数组中简单地获取项;在第二种情况中,您必须循环在links
上,并通过couples
中的键从当前夫妇中获取所有元素,并从中获取所有项。
我认为您刚刚达到创建NOSQL DB和SQL替代方案背后的主要驱动力:-)
MySQL有两种方法可以做到这一点(假设有任意长度的集合):
1-在DB中的每个集合上都有一个引用,并使用其唯一标识符作为项目表中的一列,它应该是这样的:
id set_id name whatever_col1 whatever_col2
1 1 A ... ...
2 1 B ... ...
3 1 C ... ...
4 2 X ... ...
5 2 Y ... ...
...
或者创建一个具有对(a,B)、(a,C)、(B,C)(X,Y)。。。