(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.