広告スケジューリングシステムを開発しています。ここで、そのための賞金の詳細を計算したいと思います。現在、データベースには、city と daypart の 2 つのテーブルがあります。city には 3,000 万以上のレコードが含まれ、daypart には午前 6 時から午後 10 時などの 6 つのレコードが含まれます。次に、広告の賞金を計算します。つまり、ユーザーがムンバイ市に 3 日間広告を出した場合、その賞金を計算する方法。1 つの方法は、もう 1 つのテーブルを作成し、その中に都市と時間帯のすべての組み合わせとその賞品を保持することです。しかし、このテーブルには 6,000 万以上のレコードが含まれており、新しい時間帯が追加された場合、このテーブルを再度更新する必要があり、これがさらに問題になります。元。city には 1 つのレコードが含まれ、daypart には 6 つのレコードが含まれ、新しいテーブルには合計 6 つのレコードとその賞品が含まれます。上記のシナリオの賞金を計算する他の方法はありますか?
質問する
64 次
1 に答える
0
おっしゃるように、賞金の金額は都市や時間帯によって異なる可能性があり、都市や時間帯に基づいて賞金を計算するための標準的なアルゴリズムや計算はないようです(賞金の金額はシステムの専有情報のようです)。ある種のルックアップテーブルがおそらく最善の策でしょう。
テーブルの列は次のようになります。
Countries: id (integer, non-null), countryName
Cities: id (integer, non-null), cityName, countryId
Prizes: cityId, startHour, amountPerHour
いくつかのメモ:
- 市と国は、3000万以上の市の記録の情報に基づいて複数のテーブルに分割されます。
'dayparts'を時間範囲(午後3時から午後6時)として保存するのではなく、特定の時間に開始する1時間あたりの価格としてルックアップテーブルに保存します。例えば:
CityA(id = 1)の費用が午前6時から午前9時までは15ドル、午前9時から午後12時までは30ドル(それ以外の場合は簡単にするために0)の場合、このテーブルには次のエントリが含まれます。
cityId startHour amountPerHour 1 0 0 1 6 5 1 9 10 1 12 0
- これにより、新しい時間帯を簡単に追加したり(懸念事項の1つ)、都市ごとに異なる時間帯を設定したりする柔軟性が得られます。StartHourは、その日のstartHour(0〜23)を表し、必要に応じて10進値(12:30 pmの場合は12.5)にすることもできます。
- 時間範囲の計算は、範囲内にあるstartHoursの数を把握し、amountPerHourを使用して基本的な計算を行うだけの問題になります。
これがニーズを満たさない場合、別の代替手段(あなたが述べたように)は単純なルックアップテーブルです。この場合、時間帯のテーブルがあり、賞品のテーブルはになりcityId | daypartId | amount
ます。
パフォーマンスが心配な場合、特に主キー列を適切に使用し、テーブルインデックスがある場合は、テーブルのサイズはそれほど悪くありません。
于 2012-11-21T18:59:22.333 に答える