ユーザーイベントデータを保存するための適切なテクニック


12

データベース設計に関しては、ほとんど独学です。私はこの共通の構造に落ち着いているので、この質問を提起していますが、それが最も効率的または「業界標準」の方法であるかどうか疑問に思っています。

私が設計するほとんどのデータベースにはユーザーテーブルがあり、その後、個人の活動は別のテーブルで追跡されます。データベースの美しさはこの種の効率を備えていることを理解していますが、アクティビティテーブルは、定期的に使用するすべてのユーザーから多くのイベントをかなり迅速に収集するため、中程度のユーザー使用量で非常に迅速に巨大なテーブルになります。このように成長させるのはこのベストプラクティスですか?または、テーブルの階層、日付に基づいて、またはユーザーの量ごとに、または他の何かに基づいて異なるテーブルに分割しますか?

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

学習を支援するために、何を改善できるかを知りたいだけです。

回答:


5

または、テーブルの階層、日付に基づいて、またはユーザーの量ごとに、または他の何かに基づいて異なるテーブルに分割しますか?

データベースの「パーティション化」の概念を調べてください。ほとんどのRDBMSはそれらをサポートしています(例:mysqloraclesql serverpostgresql)。基本的に、RDBMSは、毎月/年/何でも別のテーブルに保存されるという事実を作成/管理するプロセスを処理し、それにアクセスするコードはそれを1つの大きなテーブルとして扱います。

ユーザー名、日付、またはデータにアクセスするために最も頻繁に使用されるものでパーティションを作成できます。(ユーザー中心にすることと日付中心にすることの利点/欠点があります...しかし、あなたが私にそれをすべて望んでいるかどうかはわかりません)


@Joeに感謝します。Wikipedia(en.wikipedia.org/wiki/Partition_%28database%29)および投稿したリンクのいくつかでそれを読みました。参照するパーティションの種類は、水平パーティションです。これは今まで存在していたとは知らなかった機能です。ここで、新しい質問dba.stackexchange.com/questions/4134/…提示します。これは、適切なパーティション分割の実践を要求します。
CenterOrbit

6

あなたは非常に良い観察をしました。アクティビティテーブルは、高速かつ大規模に成長します。過去に行ったことは、古いデータ(14日より古いなど)をActivityHistoryテーブルにアーカイブすることです。そうすることで続ける活動扱いやすいサイズにテーブルを、あなたが研究を行うために必要がある場合は、必ずで振り返ることができますActivityHistoryテーブル。


1
私はあなたのアイデアが好きで、@ Joeソリューションをサポートしていないものも含め、ほぼすべてのデータベース設定に適合するソリューションです。しかし、古いアーカイブデータにアクセスし、ユニオン結合を追加する必要性を作成する必要がある場合、関連するクエリの一部が複雑になります。とても良いことですが、私はこのアプローチを考えていませんでした。ありがとうございました。
CenterOrbit

これは必ずしも複雑ではありません。データが古い場合はアプリから接続文字列を使用して履歴データベースを選択できます。または、プロシージャでリンクサーバーを使用でき、日時がxより古い場合日、メインサーバーの代わりにアーカイブリンクサーバーに移動します。
マリアン

ArchiveHistoryテーブルが同じデータベースにある場合は、さらに簡単です。
マイケルライリー-別名ガニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.