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

时间:2012-09-07 09:51:03

标签: php data-structures

假设我有两套

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中。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

例如,您可以在数据库中的数据集中为每个数据存储指向元素标识符的指针(或元素的抽象“耦合”的标识符(在数据库中实际不存在),如果您将使用第二种方式)行。然后,在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,并从中获取所有项目。

答案 1 :(得分:0)

我认为你刚刚达到了创建NOSQL数据库和SQL替代方案的主要推动力: - )

有两种方法可以完成MySQL(假设任意长度的集合):

1-对数据库中的每个集合进行引用,并使用其唯一标识符作为项目表中的列,它应该是这样的:

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),......

相关问题