これは最近私に提起されたかなり良い質問でした。この惑星に住むすべての人々の名前、年齢、住所で構成される架空の(お気に入りのデータストレージツールをここに挿入)データベースがあるとします。あなたの仕事は、HTMLテーブル内に18歳以上のすべての人の名前を印刷することです。どうやってそれをやりますか?仮に人口が毎秒1200の速度で増加し、それに応じてデータベースが更新されたとしましょう(方法は聞かないでください)。これらすべての人の名前と住所をHTMLテーブルに出力するための戦略は何ですか?
3 に答える
年齢をDBテーブルに保存することは、私にとっては問題のレシピのように思えます。維持することは不可能です。生年月日を保存してから、その列/属性にインデックスを作成することをお勧めします。
表示するには、テーブルの初期ダンプを取得する必要があります。18年前の日付を計算し(たとえば
D0
)、それより前に生まれた人のクエリを使用します。DBトリガーを使用して死亡に関する通知を受信し、テーブルからすぐに削除できるようにします。
人々は年をとるだけなので(残念ながら?)、範囲クエリを使用して新しい追加を取得できます(つまり、最後にテーブルを照会してから18歳になる人々)。たとえば、翌日に表示を更新する場合は、その日に生まれた人に対してクエリを発行します
D0 + 1
。テーブル全体を再度リクエストする必要はありません。翌日18歳に達した人をプリフェッチし、エントリをメモリに保持して、その年齢に達した正確な瞬間にディスプレイに追加することもできます。
ところで、各人に2KBのデータがある場合でも、18TBのデータベースを取得できます(50%のオーバーヘッドを想定)。少し強化されたサーバーは、この種のDBサイズを処理できるはずです。一方、 12TBのHTMLテーブルの考えは私を怖がらせます...
ああ、そしてタイムゾーンとDSTの問題に注意してください-時間は最近とても相対的なものです...
何が問題なのかわかりません。新しいレコードが追加されることを心配する必要はありません。クエリの実行に18年以上かかる場合を除いて、どのレコードもクエリに含まれないためです。年齢に関するインデックスがあり、おそらくその量のデータを処理するのに十分なDBテクノロジーがあり、1200が挿入時に2番目の更新インデックスを挿入する場合は、正常に機能するはずです。
現実の世界では、既存のテクノロジーなどを使用して、1日1回スナップショットを作成し、その日のレコードを含まない読み取り専用スナップショットに対してクエリを実行します。そのテーブルは、このクエリや他のほとんどのクエリには確かに十分です。
すべてのエントリを1つのテーブルに集約する必要がありますか?
年齢層ごとにテーブルを作成し(約120のテーブルのみが必要)、入力を挿入する方が簡単です。エントリを挿入するときに120のテーブルを調べる方が、調べるよりも計算が簡単だからです。エントリを探すときは6,000,000,000。