我们正在开发广告调度系统。现在,我们要为此计算奖品详细信息。现在,数据库就像,我们有 2 个表 city 和 daypart。city 包含 30+ 百万条记录,daypart 包含 6am 到 10pm 等 6 条记录。现在我们要计算广告的奖金。即,如果任何用户向孟买市投放了 3 天的广告,那么如何计算奖金。一种方法是再创建一张桌子,并在其中保留城市和时段及其奖品的所有组合。但是这个表包含 60+ 百万条记录,如果添加了新的时段,那么我们必须再次更新这个表,这更有问题。前任。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
一些注意事项:
- 根据您的 30+ 百万城市记录的信息,城市和国家被分成多个表。
与其将“时段”存储为时间范围(下午 3 点至下午 6 点),不如将其存储为从特定时间开始的每小时价格。例如:
如果 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
- 这使您可以灵活地轻松添加新的时段(您关心的一个问题),甚至每个城市都有不同的时段。StartHour 将表示一天中的 startHour (0-23),如果需要,甚至可以是十进制值(12.5 表示下午 12:30)。
- 时间范围的计算只需弄清楚你的范围内有多少个 startHours,然后用 amountPerHour 做一些基本的数学运算。
如果这不能满足您的需求,另一种选择(如您所提到的)只是一个直接查找表,在这种情况下,您将有一个时段表,而奖品表将变为cityId | daypartId | amount
.
如果您担心性能,那么表的大小并不是那么糟糕 - 特别是如果您正确使用主键列并具有表索引。
于 2012-11-21T18:59:22.333 回答