如何检查多对多集合的唯一性?

时间:2010-01-19 17:47:01

标签: php mysql hash

这是我的PHP应用程序所需的流程(是的,它很模糊,但这样更容易):

  1. 用整数ID提交一组约5个对象。 (它实际上更像是15,但让我们说5便于使用。)
  2. 应用程序检查此集合之前是否已提交,如果不是
  3. ,则将其保存在MySQL数据库中
  4. App将这些对象保存在数据库中,如果它们尚未在
  5. 之前保存

    (对象和集合是多对多的,因此有一个对象表,一个集合表和一个与这两者相关的表。)

    一些样本流程:


    1. 用户提交111,112,113,114
    2. 这套装是新的!该集合已保存。
    3. 我们已经看过对象111和112,但是获取并保存了113和114的数据,因为我们没有。

      1. 另一个用户提交111,112,113,114
      2. 我们之前见过这个系列。不要打扰保存。
      3. 自从我们看过这个系列以来,我们很明显看到了这些东西。不要打扰保存。

      4. 步骤1和3很简单。第2步是我不知道如何继续的地方。查询包含那些确切ID的集合的关系似乎不必要数据库,所以我即将发布一些明显的解决方案,如简单的ID列表和散列,但我也想知道是否还有更多那里的理想解决方案。

        谢谢!

3 个答案:

答案 0 :(得分:0)

一个明显的解决方案是在集合的数据库行中保存子ID列表,例如1111,1112,1113,1114,1115。它快速,简单,并且保证了唯一性,但是我认为比较这样的列表会造成不必要的CPU负担,特别是如果它们变长,更不用说在存储空间方面存在相当多的重复。

答案 1 :(得分:0)

另一个明显的答案是采用相同的连接字符串并采用MD5哈希 - 快速简便,但运行(授予的,小的)冲突风险。哈希是否值得使用较短字符串的性质,即使我可以轻松地100%保证不会因没有散列而发生冲突?

答案 2 :(得分:0)

在我的申请中,我将执行此步骤:

  1. 用户提交后,在进入数据库之前,我会将数据库中的数据提取到数组中。在上面的示例中,我将$collection = array('111', '112', '113', '114');
  2. 我将分两步检查新用户输入。第一步是查看它是否已存在于数据库中。如果没有,则插入。否则忽略:

    foreach ( $inputs as $input )
    {
      if ( ! in_array($input, $collection) )
      {
        //do insert here
      }
    }
  3. 然后在第二个循环中,我反向执行,删除用户未选择的数据。

    foreach ( $collection as $data )
    {
      if ( ! in_array($data, $inputs) )
      {
        //do delete here
      }
    }

    在您的情况下,您可能需要或可能不需要第二个循环。我需要这个,因为我将输入作为复选框,用户可以选择激活/取消激活,因此我将其翻译为插入和删除。