递增表设计


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

关键点是将不变化的东西固定下来,避免重复计算。设计表时,将不依赖外部数据,可直接得出的部分提取出来,方便查询。

有一快递A,快递价格递增,价格表如下:
重量(kg) 费用(元)
0-1 6
1-5 3/kg
5-10 2/kg
10-9999 1/kg
同时有一快递B,直接按公斤给价格,价格表如下:
0-1 6
1-5 16
5-10 24
10-9999 30
设计一table,将两种的价格表录入系统,并给出查询物品重量为n时的快递价格。

思路:快递A价格递增,计算时要考虑他之前物重范围相加。而B就相对简单,直接select取出。而价格表存放到同一表中,就要考虑容纳上面的两种特性。设计表如下:
快递公司 重量下限 重量上限 费用 子范围费用 (注:用附加费用存储比它小的范围的数据)
表数据存储为:
快递公司 重量下限 重量上限 费用 子范围费用
A 0 1 6 0
A 1 5 3 6 (直接给出前一范围的价格)
A 5 10 2 18
A 10 9999 1 28
B 0 1 6 0
B 1 5 16 0
B 5 10 24 0
B 10 9999 30 0

当外部传入快递公司为@X,物重为@weight时求其快递价格,可用如下方式:
SELECT CASE(附加费用) WHEN 0 THEN 费用 ELSE 子范围费用 + (n – 重量下限) * 费用
FROM 快递费用表
WHERE 快递公司 = @X
AND @weight BETWEEN 重量下限 AND 重量上限