PHP / MySQL bir kullanıcının son etkinlikleri listelemek için en iyi yaklaşım nedir?

4 Cevap php

Ben çok sorgu yapmadan sitemde bir kullanıcının son faaliyetleri listelemek istiyorum. Ben kullanıcı tarihi ile yaptığımız bütün şeylerin listesini bir tablo var.

page_id - reference_id - reference_table - created_at - updated_at

reference_id I reference_table (: yorum örnek) aramak gerekir kimliğidir. Benim etkinlik masaya bir SELECT yapmak isterseniz o zaman sorgulamak gerekir:

SELECT * FROM reference_table where id = reference_id LIMIT 1

Bir etkinlik, bir yorum, bir sayfa güncelleme veya bir abonelik olabilir. Hangisi olduğunu bağlı olarak, benim veritabanındaki diğer tablolardan farklı veri getirmesi gerekir

Bu bir yorumdur eğer ben orignal comment adını almak için gereken bir cevap, vs Örneğin, ben, yazarın adı, yorum almak gerekir

Ben birliğe BİRLİĞİ anahtar kelimenin tüm tabloları içine baktım ama hata alıyorum

1222 - kullanılan SELECT ifadeleri sütun farklı bir dizi var

sütun miktarı maç var ve benim masada hiçbiri tablo aynı miktarda vardır ve ben bunu eğlenmek için sütun oluşturmak düşkün değil olduğum için ve o iş yapmak için oldukça karmaşık görünüyor.

Ayrıca da ben (gerçi bu biri için yanlış olabilir) eğer doğru hatırlıyorum maç sütun gerektirir CASE deyimi içine baktım.

Herkes çok sorguları yapmadan bir kullanıcının son faaliyetleri liste nasıl bir fikir var mı?

PHP ve MySQL kullanıyorum.

4 Cevap

Muhtemelen farklı tablolar halinde farklı aktiviteleri bölmek istiyorum. Bu size verileri sorgulamak nasıl daha fazla flexiblity verecektir.

Eğer BİRLİĞİ kullanmayı tercih ederseniz, emin olun size UNION oluşan her bir seçme sorgusu sütun aynı sayıda kullandığınızdan emin olun.

EDIT: I was down-voted for my response, so perhaps I can give a better explanation.

Split Table into Separate Tables and UNION

Size sorgulamak için hangi kaynaklar hakkında daha açık olmasını sağlayacaktır, çünkü bu tekniği tavsiye. Şekilde yerleştirilmesi için tek bir tablo olması uygundur, ancak her zaman anlamlı bilgi almak için diğer tablolarla birlikte katılmak ayrı sorgu yapmak zorunda kalacaktır. Ayrıca, size veritabanı şeması o satırda depolanan verilere bağlı olarak farklı tablolar için bir yabancı anahtar olarak tek bir sütuna göre karartılmış olacaktır.

Siz yorum, güncelleme ve abonelik için tablolar olabilir. Bunlar ayrı ayrı sorgulanan olabilir kendi veri olurdu. Diyelim ki, TÜM kullanıcı etkinliği bakmak istedim, aşağıdaki gibi, sen biraz kolayca UNION kullanabilirsiniz:

(SELECT 'comment', title, comment_id AS id, created FROM comment)
UNION
(SELECT 'update', title, update_id as id, created FROM update)
UNION
(SELECT 'subscription', title, subscription_id as id, created 
  FROM subscription)
ORDER BY created desc

Bu bir liste görünümü ile size sağlayacaktır. Daha sonra her tür detayları bağlamak veya bir ajax çağrısı üzerine yük olabilir.

Eğer o anda kullandığınız yöntemi ile bunu başarabilir, ama bu aslında 'reference_table' ihtiyacını ortadan kaldıracak ve daha temiz bir şekilde (IMO) aynı şeyi başarmak olacaktır.

Sorun, sadece UNION similar birlikte recordsets elde etmek için kullanılabilecek olmasıdır. (Farklı sütunlar getirilen örneğin,) iki farklı sorgu birleştirmeye çalışırsanız bir hata var.

Sorguları doğası farklı ise (farklı sütun sayısı veya veri türlerini sahip) birkaç farklı sorguları yapmak ve ayrı ayrı hepsini tedavi etmek gerekir.

Başka bir yaklaşım (ben daha az zarif sanırım) tüm diğerleri ile faaliyetleri masaya katılmak KALDI olacağını, böylece sütun bir sürü bir kayıt ile bitireceğiz, ve sütunlar olmalıdır her satır için kontrol etmek gerekir Etkinlik doğasına bağlı olarak kullanılır.

İkinci oldukça seyrek recorset procudes beri Yine, ben değil, ilki ile sopa istiyorum.

UNION ile sadece sürece tüm sütunlar aynı veritiplerini gibi, her tablodan tüm sütunları almak zorunda değilsiniz.

Yani böyle bir şey yapabilirsiniz:

SELECT name, comment as description
FROM Comments

UNION

SELECT name, reply as description
FROM Replies

Comments ve Replies sütun aynı sayıda varsa ve bu önemli değil.

Bu gerçekten sitenizde trafik miktarına bağlıdır. Sendika yaklaşımı mantıklı, basit ve muhtemelen doğru olduğunu, ancak sitenizin ağır bir unioned sorgunun indeksleme zor olduğundan yüklenir eğer performans acı çekeceğim.

Birleştirme iyi olabilir, ama yine, performans ve kod netliği açısından, bu yolları iyi değil belki.

Başka bir tamamen farklı bir yaklaşım (sadece bu amaç için gerçek aktivitesine ek olarak,) aktivitesi ile güncelleştirilir bir "etkinliklerin tablo oluşturmaktır. Sisteminizde yinelenen verileri yaratacak beri DB doğruluğu eski açısından, bu yaklaşım kaçınmalısınız, Ben, ancak, performans açısından çok yararlı buldum.

Bunu almak için karar verirseniz BİRLİĞİ yaklaşım hakkında [Başka bir yan not: Eğer parametre uzunluğunda bir fark varsa, (UserId, kullanıcılar DAN UserName SEÇ) .. Örneğin, Union sendikaların bazı sahte parametreleri seçebilirsiniz (SEÇ 0 , notları UserName)