Nasıl AJAX yönetme özelliği '/ beğenmeme gibi' temelli?

2 Cevap php

Ben (çok burada SO gibi) ben yazıyorum forum komut mesajların her birine bir gibi / sevmemek-upvote / downovote-tipi özellik eklemek istiyorum. Ben bu yapılabilir nasıl anlamaya çalışan iki zorluklar yaşıyorum:

1) Ben verimli bir şekilde yapmak istiyorum bir db şema anlamaya olamaz. Ben (xyz post # 123 sever) kullanıcı ve yazı arasında bir ilişki yapmak için ayrı bir \ likeordislike\ tabloyu kullanabilirsiniz, ya da ben \ {[(1 türü \ bir sütun 'text \' kullanabilirsiniz )]} tablo) yazı sevdim (veya sevilmeyen tüm kullanıcıları dışarı liste. Elbette ikincisi ben userids hiçbirini faydalanmak için alanı ayrıştırmak gerekiyor demektir.

2) kullanıcı iki kez yazı sevmediğim / sevmeye almaz emin olun.

Muhtemelen önemsiz ama ben sadece sunucu tarafında süreçlere mysql aramalar bir çok yapmak yollar düşünebilirsiniz. Teşekkürler.

2 Cevap

(Similar answer to Jan Hančič here, but I decided my take on the ratings was different enough...)

Sevmediği / hoşlandığı saklamak için ayrı bir tablo sizin ilk düşünce kesinlikle ben gitmek istiyorum yoludur. Ben bir sonraki bit için kritik iki ana sütun (oyuncu ID ve sonrası ID) dizinler koymak istiyorum.

Örneğin:

create table users (
    userId varchar(254) not null,
    -- ...
    primary key (userId)
)
ENGINE=...;

create table posts (
    postId int(11) not null,
    title varchar(254) not null,
    content text not null,
    -- ...
    primary key (postId)
)
ENGINE=...;

create table userPostRatings (
    userId varchar(254) not null,
    postId int(11) not null,
    rating int(2) not null,
    -- ...
)
ENGINE=...;

create index userPostRatings_userId on userPostRatings(userId);
create index userPostRatings_postId on userPostRatings(postId);

Daha sonra yazılan bilgiler, örneğin almak için (bir saklı yordam olsun, kod, veya bir görünümde) birleştirilmiş bir sorgu kullanmak istiyorum:

select p.postId, p.title, p.content, avg(r.rating)
from posts p
left outer join userPostRatings r on p.postId = r.postId
where p.postId = ?
group by p.postId;

(Yani henüz herhangi bir değerlendirme yok herhangi bir mesaj için ortalama NULL dönecektir.)

Bu olsa bir çünkü oldukça verimli biri userPostRatings masaya indeksler, katılmak.

Eğer katılmak posts için bir ortalama puanı sütun ekleyerek, (çok yüksek eşzamanlılık siteler yapmak), sonra Jan önerilen şekilde biraz de-normalize etmek isteyebilirsiniz sizi öldürüyor ve onu tutmak olduğunu bulursanız güncellendi. Sadece bunu kullanmak için sorguyu değiştirmek istiyorum. Ama ben start out denormalized, daha kod ve belki erken optimizasyon var olmaz. Sizin veritabanı bu bilgilerin kaydını tutmak için vardır; kısa sürede bunu takip ediyor, bilgileri çoğaltmak gibi, size bakım ve senkronizasyon sorunları tanıtan ediyoruz. Bunlar sonunda haklı olabilir, ama benim DB bana bu konuda yardımcı olabilir varsayarak işe başlamak değildir. (Bunun için önceden plan varsa) ayarlama yapma katılmak eğer sizin durumunuzda bir sorun büyük bir anlaşma değildir.

Make a separate table in which you keep track of who likes something and who doesn't. That table will be used to check if a user already did something, so you can prevent him doing it twice. Then add another field (if you will have votes) or two (if you will have likes/dislikes) in which you will store the total amount of likes/dislikes or score, so you don't have to calculate this on-the-fly every time you display the post. And you will, off course, update this column (or columns) when somebody votes on the post.

Ve oy bağlantıyı devre dışı zahmet etmeyin. Sadece kullanıcı zaten oy varsa o linke tıkladığında kontrol ve o zaten bir döküm halinde ona oy inkar.