Çok-çok toplama özgünlüğü kontrol nasıl?

3 Cevap php

İşte benim PHP uygulaması istenen akış (evet, o belirsiz, ama bu şekilde daha kolay) bulunuyor:

  1. Kullanıcı, tamsayı kimlikleri ile yaklaşık 5 nesneleri diyelim, bir dizi gönderir. (Bu gerçekten daha 15 gibi, ama kolaylığı için 5 diyelim edeceğiz.)
  2. App bu koleksiyon daha önce ibraz edilmiş ise denetler ve bir MySQL veritabanı değilse kaydeder
  3. Daha önce kaydedilmemiş olan varsa App veritabanında bu nesneleri kaydeder

(Nesneler ve koleksiyonları çok-çok, bu yüzden bir nesne tablo, bir koleksiyon masa ve iki ile ilgili bir tablo var.)

Birkaç örnek akar:


  1. Kullanıcı 111, 112, 113, 114 gönderir
  2. Bu set yeni! Koleksiyon kaydedilir.
  3. Biz 111 ve 112 nesneleri görülebilir, ama almak ve biz beri, 113 ve 114 için verileri kaydetmek ettik.

  1. Başka bir kullanıcı, 111, 112, 113, 114 gönderir
  2. Biz daha önce bu koleksiyon gördüm. Tasarrufu rahatsız etmeyin.
  3. Biz koleksiyonu gördük yana, biz tabii ki nesneleri gördüm. Tasarrufu rahatsız etmeyin.

Adım 1 ve 3 basit. Ben devam etmek nasıl emin değilim nerede Adım 2 olduğunu. Bu gereksiz veritabanı ağır olanlar tam kimliklerini içeren setleri için ilişkiyi sorgulama gibi görünüyor, bu yüzden böyle bir basit kimlik listesi ve karma gibi bir kaç belirgin çözümler göndermek üzereyim, ama aynı zamanda daha varsa bilmek isterim Orada ideal bir çözüm.

Teşekkürler!

3 Cevap

Bir bariz çözüm, koleksiyonun veritabanı satırı örneğin 1111,1112,1113,1114,1115 çocukların kimliklerinin bir listesini kurtarmaktır. Bu hızlı, kolay ve teminatlar teklik, ama depolama alanı söz konusu olduğunda çoğaltılması adil bir miktar onlar uzun olsun, özellikle gereksiz yere CPU-ağır bu gibi listeler karşılaştırmak olacağını hayal, söz değil.

Bariz bir başka cevap aynı Zincirleme dize almak ve MD5 hash almaktır - hızlı ve kolay, ama çarpışma (verilen, küçük) risk çalışır. Ben kolayca karma değil tarafından çarpışmaları olan asla% 100 garantisi var olsa dahi, kısa dizeleri doğası gereği kullanarak değer karma mı?

Benim uygulamada, ben bu adımı yapacağım:

  1. Kullanıcı sonra teslim ve veritabanına girmeden önce, ben bir diziye veritabanındaki verileri almak olacaktır. Yukarıdaki örnekte, ben sahip olacaktır $collection = array('111', '112', '113', '114');
  2. Ben iki adımda yeni kullanıcı girişini kontrol edecektir. İlk adım zaten veritabanında ya da değil o olmadığını görmek için. Bu Eğer değilse, o zaman yerleştirin. Aksi halde görmezden:

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

Sonra ikinci döngü, ben kullanıcı tarafından seçilen değil verileri silmek için, ters bunu.

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

Sizin durumda, ya da ikinci bir döngü gerek olmayabilir olabilir. Ben onay kutuları olarak giriş yapmak beri kullanıcı etkinleştirmek / devre dışı bırakmak, böylece ben insert olarak çevirmek ve silmek için seçebilirsiniz, bu gerekli.