Ben bir yazılım geliştiricisiyim. Kodlamayı seviyorum, ancak veritabanlarından nefret ediyorum ... Şu anda, bir kullanıcının bir varlığı sevdiği (FB'deki gibi) olarak işaretlemesine , etiketlemesine ve yorumlamasına izin verilecek bir web sitesi oluşturuyorum .
Bu işlevselliği işlemek için veritabanı tabloları tasarımına takıldım. Çözüm önemsizdir, eğer bunu sadece bir tür şey için yapabilirsek (örn. Fotoğraflar). Ancak bunu 5 farklı şey için etkinleştirmem gerekiyor (şimdilik, ancak tüm hizmet büyüdükçe bu sayının büyüyebileceğini de varsayıyorum).
Burada benzer sorular buldum, ancak hiçbirinin tatmin edici bir cevabı yok, bu yüzden bu soruyu tekrar soruyorum.
Soru, farklı tablolar , farklı tablolar için beğeniler ve onlar için etiketler saklayabilmeleri için veritabanının nasıl düzgün, verimli ve elastik olarak tasarlanacağıdır . Cevap olarak bazı tasarım desen en iyi olacak;)
Ayrıntılı açıklama : Bir sahip tablo User
bir kullanıcı verileri ile ve 3 daha fazla tablo : Photo
ile fotoğrafları , Articles
ile eşyalar , Places
ile yer . Oturum açmış herhangi bir kullanıcının aşağıdakileri yapmasını sağlamak istiyorum:
bu 3 tablodan herhangi birine yorum yap
herhangi birini beğendi olarak işaretle
herhangi birini bir etiketle etiketleyin
Ayrıca her öğe için beğeni sayısını ve belirli bir etiketin kaç kez kullanıldığını saymak istiyorum.
1 st yaklaşım :
a) için etiketleri , bir yaratacak tablo Tag [TagId, tagName, tagCounter]
, o zaman yaratacak birçok çoğa ilişkileri tabloları için: Photo_has_tags
, Place_has_tag
,Article_has_tag
.
b) Aynı yorumlar yorumlar için de geçerlidir.
c) Bir yaratacak tablo LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. Sayısı sever tarafından hesaplanacaktır sorgular (Kötü olduğunu varsayalım). Ve...
Son bölüm için bu tasarımı gerçekten sevmiyorum, benim için kötü kokuyor;)
2 nd yaklaşım :
Ben bir tablo yaratacak ElementType [idType, TypeName == some table name]
isimleriyle yönetici (benim) tarafından doldurulur tablolar olabilir sevdim , yorumladı veya etiketlenebilecek . Sonra tablolar oluşturacağım :
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
ve her biri için uygun sütunlara sahip Yorumlar ve Etiketler için aynıdır. Şimdi, beğendiğim bir fotoğraf yapmak istediğimde ekleyeceğim:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
ve yerler için:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
ve böylece ... İkinci yaklaşımın daha iyi olduğunu düşünüyorum, ama aynı zamanda bu tasarımda bir şey eksik gibi hissediyorum ...
Sonunda, öğenin kaç kez sevildiğine dair sayacı depolamak için en iyi yerin hangisi olduğunu merak ediyorum. Sadece iki yol düşünebilirim:
- elemanda (
Photo/Article/Place
) tablosunda - select count () ile.
Umarım bu konudaki açıklamam şimdi daha kapsamlı.