2

Let's say I have two sets

Set 1: A, B, C

Set 2: X, Y, Z

When element B is accessed we should also retrieve A and C together with B, the other elements in Set 1

I can achieve this with permuting each set and creating an entry in a hashtable for each element of the set and storing/copying all values available in that set, such as;

A: A, B, C
B: A, B, C
C: A, B, C

But that has a memory cost and can become inefficient for large data sets. I'm trying to achieve this without going for a graph database. Data is stored in MySQL. Any suggestions?

4

2 回答 2

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,并从中获取所有项目。

于 2012-09-07T10:02:15.127 回答
0

我认为您刚刚了解了创建 NOSQL DB 和 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)、...

于 2012-09-07T10:04:58.323 回答