2010-01-19 2 views
0

est ici le débit souhaité de mon application PHP (oui, il est vague, mais il est plus facile de cette façon):Comment vérifier l'unicité de la collection plusieurs-à-plusieurs?

  1. utilisateur soumet un ensemble de, disons, environ 5 objets par ID entiers. L'application vérifie si cette collection a déjà été soumise et l'enregistre dans une base de données MySQL sinon
  2. L'application enregistre ces objets dans la base de données. , si elles ne sont pas sauvés avant

(sont nombreux à plusieurs objets et collections, donc il y a une table d'objets, une table de collections, et une table concernant les deux.)

a quelques flux d'échantillon:


  1. Soumissions de l'utilisateur 111, 112, 113, 114
  2. Cet ensemble est nouveau! La collection est enregistrée.
  3. Nous avons vu les objets 111 et 112, mais récupérons et sauvegardons les données pour 113 et 114, car nous ne l'avons pas fait.

  1. Un autre utilisateur soumet 111, 112, 113, 114
  2. Nous avons vu cette collection avant. Ne vous embêtez pas à économiser.
  3. Depuis que nous avons vu la collection, nous avons évidemment vu les objets. Ne vous embêtez pas à économiser.

étapes 1 et 3 sont simples. L'étape 2 est où je ne suis pas sûr de savoir comment procéder. Il semble inutilement difficile d'interroger la relation pour les ensembles contenant ces identifiants, donc je suis sur le point de poster quelques solutions évidentes comme une simple liste d'ID et un hachage, mais j'aimerais aussi savoir s'il y a plus des solutions idéales là-bas.

Merci!

Répondre

0

Une solution évidente consiste à enregistrer une liste d'ID enfants dans la ligne de base de données de la collection, par exemple 1111,1112,1113,1114,1115. C'est rapide, facile, et garantit l'unicité, mais j'imagine que ce serait inutilement lourd pour le CPU de comparer des listes comme celle-ci, surtout si elles sont longues, sans parler du fait qu'il y a beaucoup de duplication quand il s'agit d'espace de stockage.

0

Une autre réponse évidente est de prendre la même chaîne concaténée et de prendre le hachage MD5 - rapidement et facilement, mais court le risque (accordé, petit) de collision. Est-ce que le hachage vaut la peine d'utiliser par nature des chaînes plus courtes, même si je pourrais facilement avoir une garantie de 100% de ne jamais avoir de collisions en ne hachant pas?

0

Dans ma demande, je vais faire cette étape:

  1. Après l'utilisateur soumettre, et avant d'entrer dans la base de données, je vais chercher les données dans la base de données dans un tableau. Dans votre exemple ci-dessus, je vais avoir $collection = array('111', '112', '113', '114');
  2. Je vais vérifier la nouvelle entrée utilisateur en deux étapes. La première étape consiste à voir si elle est déjà dans la base de données ou non. Si ce n'est pas le cas, insérez-le.Sinon Ignore:

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

Puis dans la deuxième boucle, je le fais en sens inverse, de supprimer les données non sélectionné par l'utilisateur.

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

Dans votre cas, vous pourriez ou non avoir besoin de la deuxième boucle. J'en avais besoin car je fais les entrées sous forme de cases à cocher, que l'utilisateur peut choisir d'activer/désactiver, donc je le traduis en insertion et en suppression.

Questions connexes