Teknik yang tepat untuk menyimpan data acara pengguna


12

Saya sebagian besar otodidak dalam hal desain database. Saya mengajukan pertanyaan ini karena saya telah menetapkan struktur umum ini, tetapi saya bertanya-tanya apakah ini metode yang paling efisien atau 'standar industri'.

Sebagian besar database yang saya desain memiliki tabel pengguna, dan kemudian aktivitas orang dilacak di tabel lain. Saya mengerti bahwa keindahan basis data adalah memiliki efisiensi semacam ini, tetapi tabel aktivitas akan mengumpulkan banyak banyak peristiwa dengan cukup cepat hanya dari setiap pengguna yang menggunakannya secara teratur, sehingga menjadi tabel besar dengan cepat dengan penggunaan pengguna yang moderat. Apakah praktik terbaik ini membiarkannya tumbuh dengan cara ini? Atau apakah tingkatan tabel, atau pemisahan ke tabel yang berbeda berdasarkan tanggal, atau per jumlah pengguna, atau sesuatu yang lain?

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

Saya hanya ingin tahu di mana saya bisa meningkatkan apa pun, untuk membantu saya belajar.

Jawaban:


5

Atau apakah tingkatan tabel, atau pemisahan ke tabel yang berbeda berdasarkan tanggal, atau per jumlah pengguna, atau sesuatu yang lain?

Anda mungkin ingin melihat konsep 'partisi' dalam database Anda. Sebagian besar RDBMSes memiliki beberapa dukungan untuk mereka (misalnya, mysql , oracle , sql server , postgresql ). Pada dasarnya, Anda membiarkan RDBMS menangani proses menciptakan / mengelola fakta bahwa setiap bulan / tahun / apa pun disimpan dalam tabel terpisah, sementara kode yang mengaksesnya memperlakukannya sebagai satu tabel besar.

Anda dapat mempartisi berdasarkan nama pengguna, tanggal, atau apa pun yang akan paling sering digunakan untuk mengakses data. (ada kelebihan / kekurangan membuatnya menjadi user-centric vs date-centrid ... tapi saya tidak tahu apakah Anda ingin saya membahas semua itu)


Terima kasih @ Jo, saya membacanya di Wikipedia ( en.wikipedia.org/wiki/Partition_%28database%29 ) dan beberapa tautan yang Anda poskan. Jenis partisi yang Anda maksud adalah partisi horizontal. Ini adalah fitur yang saya tidak tahu ada sampai sekarang. Sekarang saya akan mengajukan pertanyaan baru: dba.stackexchange.com/questions/4134/… yang menanyakan praktik partisi yang tepat.
CenterOrbit

6

Anda telah melakukan pengamatan yang sangat baik. The Activity meja akan tumbuh cepat dan besar. Apa yang telah saya lakukan di masa lalu adalah mengarsipkan data lama (misalkan lebih dari 14 hari) ke tabel ActivityHistory . Melakukan hal itu membuat tabel Activity ke ukuran yang dapat dikelola dan jika Anda perlu melakukan riset, Anda selalu dapat melihat kembali tabel ActivityHistory .


1
Saya suka ide Anda, dan ini adalah solusi yang sesuai dengan hampir semua pengaturan database bahkan yang tidak mendukung solusi @Joe. Namun ini juga akan memperumit beberapa pertanyaan yang terlibat jika Anda perlu mengakses data yang diarsipkan yang lebih lama dan menciptakan perlunya menambahkan gabungan serikat pekerja. Sangat bagus, saya tidak memikirkan pendekatan ini. Terima kasih.
CenterOrbit

Ini tidak selalu rumit, Anda dapat bermain dengan string koneksi dari aplikasi untuk memilih riwayat db dalam hal data lebih lama .. Atau Anda dapat menggunakan server yang ditautkan dalam prosedur, dan dalam kasus beberapa datetime lebih tua dari x hari, buka Archive linked server alih-alih server utama.
Marian

Ini bahkan lebih rumit jika tabel ArchiveHistory ada di database yang sama.
Michael Riley - AKA Gunny
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.