kullanıcı etkinliği veritabanı yapısı

3 Cevap php

Ben bir topluluk web sitesi üzerinde çalışıyorum. Ben web sitesinde 2 yerlerde kullanıcının faaliyet göstermek istiyoruz.

  1. Kullanıcı "A" Profil.
  2. Kullanıcı "A" arkadaş Arkadaşlar sayfası. "What are your friends doing?"

Örneğin tablolar şunlardır:

  • üye
  • üye_gallery
  • üye_videos
  • üye_friends

benim sorunum Sql yapıdadır. Ben bu soruyu okudum "User recent activities - PHP MySql"

"Sendika" iyi fikirdir ama ben alternatif bir tane var. Ben adlı yeni bir tablo yapmak için gidiyorum

  • üye_activity

Alanlar:

id | user_id | photo | video | friend | p_id | v_id | f_id | datetime

adlı kullanıcı sadece uploaded an image var diyelim.

id | user_id | photo | video | friend | p_id | v_id | f_id | datetime
1  |   15    |   1   |   0   |    0   | 1203 |   0  |   0  |  NOW()

advantages:

  • I bir SELECT sorgusu yaptığınızda, bir fotoğraf, video ya da bir dostluk etkinliği ise, ben kolayca biliyorum.
  • Kullanıcı 'fotoğraf faaliyeti' silmek, ancak fotoğraf tutabilirsiniz.
  • Kolayca kullanıcının arkadaşlarını uyarabilir.

disadvantages:

  • Tablo satırları çok sayıda?

Herhangi bir fikir veya öneri büyük web siteleri onunla nasıl başa? vb digg, facebook,

3 Cevap

Ben bir tek tablo yaklaşım burada iyi olduğunu, doğru olduğunu düşünüyorum. Bir dezavantaj, ancak iyi ölçek olmamasıdır - ne linki ya da yorum etkinlik türleri eklemek isterseniz? Bu model ile bu her biri için başka bir sütun eklemek gerekiyor. Ben Rails-arazi gördüğüm bir yaklaşım böyle olmazdı polimorfik modelini kullanmaktır:

id | user_id | activity_type_id | p_id | v_id | f_id | datetime

Ben activity_type_id ile video, fotoğraf, vs yerine ettik görebilirsiniz. Sonra denilen ikinci bir tablo olabilir activity_types olacaktır:

 id | name
----+-------
  1 | photo
  2 | video
  3 | ...

Sonra oluşturduğunuzda members_activity Eğer uygun activity_type_id atayabilirsiniz kaydedebilir ve bunu daha sonra yeni faaliyet türleri oluşturmak istiyorsanız nispeten acısız, ve sen olabilir {[(2)] Basit bir JOIN, örn aktivite} belirli bir türüdür:

SELECT * FROM members_activity
  JOIN activity_types ON members_activity.activity_type_id = activity_types.id
 WHERE activity_types.name = 'photo';

Eğer satır çok sayıda varsa, gerçekten sürece düzgün dizin tablo olarak pratik bir dezavantaj olacak değildir.

En azından ben would indeksi user_id ve datetime, tarihe göre belirli bir kullanıcı ve sipariş için aktivite seçerek olacaktır varsayarak.

Indekslerinizin sık sık çalışan sorguları için optimize sağlamak için MySQL'in EXPLAIN (<query>) kullanın.

  • Eğer arkadaş id neden ihtiyaç görmüyorum. Arkadaşlar sayfa için önce tüm arkadaşları için bir seçme yapacağını, daha sonra etkinlik tablosundan seçin nerede (2,6,89 vb) User_id

  • Ben fotoğraf ve video alanları fotoğraf ve video değerler olacaktır tipi denilen tek bir alan, yapacak, daha sonra daha fazla etkinlik türlerini ekleyebilirsiniz bu şekilde

  • Ben .. p_id yapmak ve item_id adlı tek bir sütunu v_id istiyorum 2 sütun gerek

  • Ben bir json biçiminde diğer bilgileri saklamak istiyorsunuz ekstra bir sütun denilen bilgi eklemek istiyorum. Bu tüm olaylar var ekstra verileri içindir. Örneğin, profilinize bir bağlantı eklemek için bir olay olabilir ... ve diğer olayları iyi bir çözüm olacağını adresler var ve sadece bu olay türü için bir sütun ekleyerek yok çünkü, orada linki koyabilirsiniz