Kullanıcıların etkinlik verilerini depolamak için uygun teknik


12

Veritabanı tasarımları söz konusu olduğunda çoğunlukla kendim öğretiyorum. Bu soruyu soruyorum çünkü bu ortak yapıya karar verdim, ancak bunun en verimli veya 'endüstri standardı' yöntem olup olmadığını merak ediyorum.

Tasarladığım çoğu veritabanının bir kullanıcı tablosu var ve daha sonra bir kişi aktivitesi başka bir tabloda izleniyor. Veritabanının güzelliğinin bu tür verimliliklere sahip olduğunu anlıyorum, ancak etkinlik tablosu, düzenli olarak kullanan her kullanıcıdan oldukça hızlı bir şekilde birçok olay toplayacak, böylece ılımlı kullanıcı kullanımı ile oldukça hızlı bir şekilde büyük bir tablo haline gelecektir. Bu şekilde büyümesine izin vermek en iyi yöntem midir? Veya bir katman katmanı mı, yoksa tarihlere mi, kullanıcı sayısına göre mi yoksa başka bir şeye göre mi farklı tablolara bölünmek?

+--------------------+                   +------------------------+
|   UserData         |                   |   Activity             |
+-=------------------+                   +------------------------+
| ID     (auto uint) | <--1-to-many-+    | ID  (auto uint)        |
| UserName (text)    |              +--> | UserID (uint)          |
| Email    (text)    |                   | Timestamp (time)       |
| additional info... |                   | Type (ID to elsewhere) |
+--------------------+                   | additional info...     | 
                                         +------------------------+

Öğrenmeme yardımcı olmak için her şeyi nerede geliştirebileceğimi bilmek istiyorum.

Yanıtlar:


5

Veya bir katman katmanı mı, yoksa tarihlere mi, kullanıcı sayısına göre mi yoksa başka bir şeye göre mi farklı tablolara bölünmek?

Veritabanınızdaki 'bölümleme' kavramına bakmak isteyebilirsiniz. RDBMS'lerin çoğu onlar için bazı desteklere sahiptir (örneğin, mysql , oracle , sql server , postgresql ). Temel olarak, RDBMS'nin her ay / yıl / her şeyin ayrı bir tabloda depolandığı gerçeğini oluşturma / yönetme işlemini gerçekleştirmesine izin verirken, ona erişen kod büyük bir tablo gibi davranır.

Kullanıcı adına, tarihe veya verilere erişmek için en sık kullanılacak olanlara göre bölümleyebilirsiniz. (kullanıcı merkezli ve tarih merkezli yapmanın avantajları / dezavantajları var ... ama tüm bunlara girmemi isteyip istemediğinizi bilmiyorum)


Teşekkürler @Joe, Wikipedia'da ( en.wikipedia.org/wiki/Partition_%28database%29 ) ve gönderdiğiniz bazı bağlantılarda okudum . Bahsettiğiniz bölümleme türü yatay bölümleme olacaktır. Bu şimdiye kadar var olduğunu bilmediğim bir özellik. Şimdi yeni bir soru soracağım: uygun bölme uygulaması isteyen dba.stackexchange.com/questions/4134/… .
CenterOrbit

6

Çok iyi bir gözlem yaptınız. Etkinlik masa hızlı ve büyük büyüyecek. Geçmişte ne yaptım eski verilerin (14 günden eski) kapalı bir ActivityHistory tabloya arşivdir . Bunu yapmak, Etkinlik tablosunu yönetilebilir bir boyutta tutar ve araştırma yapmanız gerekirse, her zaman ActivityHistory tablosuna bakabilirsiniz .


1
Fikrinizi beğendim ve @Joe çözümünü desteklemeyenlerin bile hemen hemen her veritabanı kurulumuna uyacak bir çözüm. Yine de, daha eski arşivlenmiş verilere erişmeniz ve birleşim birliği ekleme zorunluluğu yaratmanız gerektiğinde, bazı sorguları da karmaşık hale getirir. Çok iyi olsa da, bu yaklaşımı düşünmedim. Teşekkür ederim.
CenterOrbit

Bu mutlaka karmaşık değildir, verilerin eski olması durumunda geçmiş db seçmek için uygulamadan bağlantı dizeleri ile oynayabilirsiniz .. Ya da yordamlarda bağlantılı sunucuları kullanabilirsiniz ve bazı datetime x'den büyük olması durumunda günlerinde, ana sunucu yerine Arşiv bağlantılı sunucuya gidin.
Marian

ArchiveHistory tablosu aynı veritabanındaysa daha da karmaşıktır.
Michael Riley - AKA Gunny
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.