web-dev-qa-db-ja.com

タイムスタンプを保存して、簡単にアクセスでき、スペースを取りすぎないようにする方法

これをすべて読みたくない場合は、下部にあるtldr! :)

まず、私が使用しているデータベースはMongoDBです!だから私は楽しいプロジェクトを作っていて、すべて順調ですが、小さな問題にぶつかりました。事実上、プロジェクトはWebサイト上の単純なボタンと考えることができます。ボタンをクリックするたびに、クリックがソケットを介してバックエンドに送信され、データベースに記録および保存されます。クリックするたびに1ずつ増加する「buttonClicks」と呼ばれるキーを持つ単純なMongoデータベースがあるので、これは非常に小さくて簡単です。また、例として、クリックの送信元のブラウザと同様に、他のいくつかの増分データが送信されます。とにかく、スキーマは現在このように見えます

{
    name: Admin
    buttonClicks: 22,
    whichBrowser: {chrome: 10, Edge: 12}
}

ご覧のとおり、これはすべて増分データであり、地球上には少数のブラウザしかないため、whichBrowserオブジェクトはそれほど大きくなりません。

問題は、タイムスタンプも必要です。つまり、現在の設定方法です。1日目から現在までにボタンがクリックされた回数がわかります。今日/週/月のボタンクリック数を確認したい場合はどうすればよいですか。これをグラフで表示する予定なので、Xの量でビニングすることもできます。したがって、過去1日間のクリック数を5分間隔で表示したり、過去1週間のクリック数を10分間隔で表示したりする場合にグラフにしたいと思うかもしれません。

どうすればこれを達成できますか?現在のところ、データベースには基本的に1つのキーがあり、単純に増分する値があるため非常に小さいですが、クリックごとにタイムスタンプをそのまま保存すると、データベースは「buttonClicks」でMASSIVEになると想像します。巨大なオブジェクトの値を持つキー。

{
    name: Admin
    buttonClicks: [{
        date: "3/27/2020 - 12:44:15",
        browser: chrome
    },{
        date: "3/27/2020 - 12:44:15",
        browser: chrome
    },{
        date: "3/27/2020 - 12:44:15",
        browser: Edge
    },{
        date: "3/27/2020 - 12:44:16",
        browser: chrome
    },{
        date: "3/27/2020 - 12:44:16",
        browser: fire fox
    }]
}

ご覧のとおり、クリック数は5回しか記録されていませんが、すでに非常に大きいです。言うまでもなく(この例では)2秒しか経過しておらず、この配列にはすでに5つのオブジェクトがあります。

ありがとうございました!だから誰もが各クリックを保存する方法についてのアドバイスを持っていますか(そしてブラウザのような他の情報)

tldr:ボタンがサイトでクリックされてバックエンドに記録されます。これは単なる増分データ(ボタンのクリックが記録されたときに値を1増やすだけ)なので、今のところ少しのスペースが必要ですが、データの視覚化のために日付と時刻。クリックごとにデータを記録できるので、スペースをとらず、簡単に操作できます(先週のクリック数など)。過去10日など)

2
WildWombat

ここでの主な問題は、データ量(mongoがBIGのものを処理できる)ではなく、最大ドキュメントサイズ16 MBです。

したがって、ファイルシステムでのログローテーションのようなある種の「ページング」が必要です。標準的なアプローチは、特定の時間間隔ごとのドキュメントから開始することです。日:

{
    "name": "Admin",
    "recordingStart": "3/27/2020",
    "buttonClicks": [...]
}

多くの場合、これですでに十分です。

ただし、サイトのトラフィックが多いため、これが大きくなりすぎる場合は、継続ドキュメントを追加します。

{
    "name": "Admin",
    "recordingStart": "3/27/2020",
    "ordinal": 1,
    "buttonClicks": [...]
    "continueWith": 2
}

{
    "name": "Admin",
    "recordingStart": "3/27/2020",
    "ordinal": 2,
    "buttonClicks": [...]
}

適切な基本時間間隔を使用すると、これにより、後の集計が大幅に容易になります。

3
mtj

たぶん 圧縮アルゴリズム からいくつかの教科書「トリック」を借りますか?

{
    name: Admin
    buttonClicks: [{
        date: "3/27/2020 - 12:44:15",
        browser: chrome
    },{
        date: "3/27/2020 - 12:44:15",
        browser: chrome
    },{
        date: "3/27/2020 - 12:44:15",
        browser: Edge
    },{
        date: "3/27/2020 - 12:44:16",
        browser: chrome
    },{
        date: "3/27/2020 - 12:44:16",
        browser: fire fox
    }]
}

辞書を考えてみましょう:

startDate: "3/27/2020 - 12:44:15"
chrome: 1
Edge: 2
firefox: 3

そして、secondsstartDateから経過した秒数を表すという規則を使用します。

元のデータは次のようになります。

{
    name: Admin
    buttonClicks: [{
        seconds: 0
        browser: 1
    },{
        seconds: 0,
        browser: 1
    },{
        seconds: 0,
        browser: 2
    },{
        seconds: 1,
        browser: 1
    },{
        seconds: 1,
        browser: 3
    }]
}

これはスペースを節約しますか?

0
Vector Zita