Arama sonuçlarını kaydetmek için veritabanı yapısı

4 Cevap php

Ben şu anda bir sosyal ağ web sitesi için çalışır.

Patronum geçenlerde yerine normal bir sonuç (kayıt tarihi) rastgele arama sonuçlarını göstermek için bir fikrim yoktu. Bunda sorun basit ve açıktır: Eğer başka bir sayfaya giderseniz, bu liste her zaman randomize olarak her zaman farklı sonuçlar göstermek için gidiyor.

Ben veritabanı + böyle bir tanımlama şey sonuçlarını saklamak fikri vardı:

  • $ _POST Isteği tefrika sürümünü içeren Cookie (biz yeniden sıralama yapmak istiyorsanız gerekli)
  • Arama id => aramalarda baz (id, kullanıcı _id, creation _tarihi) olarak hizmet verecek bir tablo
  • Sonuçlarını depolamak ve bunların sırası => arananlar _results (search_id, order, user _id) olacak bir tablo hangi

Akış şeması bir şey gibi görünecektir:

  • Her aramadan sonra ben saklamak "burada" bir çerez veya oturumuna
  • Sonra "arayışlarında" önceki bir aramayı silmek
  • Sonra "searches_results" önceki sonuçlarını silmek
  • Sonra anahtarı için "arama" bir satır eklemek
  • Sonra "searches_results" içine her kullanıcı satır eklemek
  • Ve nihayet ben? Search_id = [SEARCH_KEY] gibi somethink için kullanıcı yönlendirme

Burada büyük bir kusur var: performanslar .... aşağı VEYA çok yavaş sistemini VEYA yapmak kesinlikle mümkündür.

Herhangi bir fikir ne bu yapı iyi olurdu?

4 Cevap

Yerine rastgele sipariş ne varsa, sipariş bilinen ve tekrarlanabilir bazı işlevi, sadece non-açık emretti? Bunu daha az belirgin bu tekrarlar olmak yapmak arama sorgusu bazı veriler ile böyle bir işlevi tohum olabilir. Bu şekilde, sayfa ileri geri sonuçları ile ve her zaman beklediğiniz alabilirsiniz. (Geri tıklarsanız, önceki şarkıyı olsun ki, ve bir sonraki tekrar tıklarsanız, başladığınız yere geri konum) Müzik oyuncular shuffle özelliği için fonksiyonunun bu tür kullanın. Bunu gerçekleştirmek için bazı fonksiyon ilahi eminim ... bazıları (sorgu) sabit ve ardından çıkan sayısına göre sıralama ile bitwise XORing Kimlik değerleri yeterli olabilir. Size tekrarlanabilir ve non-bariz sonuçlar alacak bir trivially basit bir fonksiyon çünkü ben keyfi XOR seçti.

Belki mırıldanmaya, ama bir OR özel ise xor operatör sadece demiyor? Yani, bildiğim kadarıyla ben tho bildiği gibi, burada hiçbir matematiksel işlem yoktur.

Üzgünüm, bu yardımcı olmuyor biliyorum, ama patron bu neden isteyeyim ben anlamıyorum?

Ben bir sosyal ağdaki bir kişi için arama yaparsanız, o zaman sonuçları alaka ve sadece alaka ile sipariş etmek istediğini biliyorum. Ben randomize sonuçları sadece kullanıcı için sinir bozucu olacağını düşünüyorum, ama belki bu sadece benim.

Ben "John Smith" için arama Örneğin, daha sonra sonuçlar ilk ilk parti daha iyi "John Smith" adında insanlar. Sonra bana sonuçların sonuna benzer adlarını gösterir. Ben "John Smith" için arama ve benim ikinci sonuç olarak "Jon Smithers" almak istemiyorum.

Eh, ben soran Matt ile yaşıyorum "Neden?"

Ben rmeador de iyi bir öneri olduğunu düşünüyorum. Rastgele farklı bir alana veya algoritmanın çeşit göre sıralamak olabilir. Sadece son güncelleme DESC / ASC permütasyon veya başka bir sonuç alanında.

Diğer seçenek ilk arama ilk defa yapmak ve kimlik tek ilgili dönün ve sonra veritabanında tam kimliklerinin dize saklamak olacaktır ve sonraki her sayfa sonra bu kimlikleri karşı bir arama olduğunu.

Benim iki sent.

Randomize bir sonuç kümesi kullanışlı değil aramak için değil, profiller ya da sanatçı veya yerel etkinlikler tarama için nerede bir senaryo görebiliyorum. Bu geleneksel yönettiği aramada göstermek olmaz olanlar için daha fazla maruz sunuyor.