访问集合中相关元素的理想数据结构


Ideal data structure for accessing related elements in a set

假设我有两套

Set 1: A, B, C
Set 2: X, Y, Z

当元素B被访问时,我们还应该检索AC以及BSet 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)。。。