日期:2014-05-18  浏览次数:20406 次

极具挑战的SQL难题,看看你对SQL熟悉多少
客户要求灵活的价格体系,要求如下
商品会存在多个地区价格,同一地区又存在多个价格类型,不同价格类型的价格不一样,比如同样是一瓶百事可乐,
在北京的价格如下:
价格A:2.7
价格B:2.8
价格C:2.85
价格D:2.9
价格E:3.0
。。。。。。。

在拉萨的价格如下:
价格A:2.2
价格B:2.3
价格C:2.4
价格D:2.5
价格E:3.6
价格F:3.7


在四川的价格如下:
价格A:3.2
价格B:4.3
价格C:5.4
价格D:6.5
价格E:7.6
价格F:8.7
。。。。。。。

请问你们如何处理这个问题(在数据库设计上,是用列扩展还是行扩展)

我的初步考虑方案:
1、 在商品资料表上增加字段, 用2个字段描述商品的价格
  字段A代表价格类型
  字段B代表价格类型所对应的值
  字段A:A,B,C,D,E,F,G,H
  字段B:1,2,3.5,2.23,3.5
2、用一个表来记录各商品的价格,一个价格类型对应一行
  商品编码,价格类型 ,价格
  00001 A 2.3
  00001 B 1.3
  00001 C 7.3
  00001 D 6.3
  ............


  但是问题来了,在查询商品资料的时候,第一个方案,存在的需要转换分解(从一个字段分解成多个价格字段表示)
  第二个方案,存在大量冗余,造成数据量非常大,查询速度慢
  在此听听你们的高见 !!!!!!!!!!!!!
  欢迎和我讨论 QQ 110855663
 


------解决方案--------------------
SQL code

DECLARE @GOODS TABLE(
GOODSID INT PRIMARY KEY,
GOODSNAME NVARCHAR(50)
)
INSERT INTO @GOODS
SELECT 1,'可乐'
UNION ALL
SELECT 2,'雪碧'
DECLARE @GOODS_PRICE TABLE(
GOODSID INT,
AREA NVARCHAR(50),
PRICETYPE NVARCHAR(50) ,
PRICE NUMERIC(19,6)
)
INSERT INTO @GOODS_PRICE
SELECT 1,'北京','价格1',1.11
UNION ALL
SELECT 1,'北京','价格2',2.22
UNION ALL
SELECT 1,'上海','价格1',3.33
UNION ALL
SELECT 1,'上海','价格2',4.44
UNION ALL
SELECT 2,'北京','价格1',5.55
UNION ALL
SELECT 2,'北京','价格2',6.66
UNION ALL
SELECT 2,'上海','价格1',7.77
UNION ALL
SELECT 2,'上海','价格2',8.88

SELECT GS.GOODSID,GS.GOODSNAME,GP.AREA,GP.PRICETYPE,GP.PRICE
FROM @GOODS GS
LEFT JOIN @GOODS_PRICE GP
ON GS.GOODSID=GP.GOODSID
ORDER BY GS.GOODSID,GP.AREA,GP.PRICETYPE,GP.PRICE
/*
1    可乐    北京    价格1    1.110000
1    可乐    北京    价格2    2.220000
1    可乐    上海    价格1    3.330000
1    可乐    上海    价格2    4.440000
2    雪碧    北京    价格1    5.550000
2    雪碧    北京    价格2    6.660000
2    雪碧    上海    价格1    7.770000
2    雪碧    上海    价格2    8.880000
*/

------解决方案--------------------
探讨
建议你分两个表

一个表是
商品地区表(商品,地区)
另外一个表是
商品价格表(商品,价格类型,单价)




------解决方案--------------------
我觉得应该首先有每个商品有一个基础价格,任何一个价格都是在这个价格之上的一个百分比,对于不同的地区,使用的是某几种百分比,数据库里面不要存放商品价格,所有商品价格都是基础价格根据百分比计算出来的,不同地区和不同的百分比可以组成多种价格方案,

就想了这么多,
------解决方案--------------------
从传统的数据库设计来看无非就是 扩展列或者行,讨论来讨论去的 有什么意思
楼主如果用的是新的数据库引擎的话sql2005 ,oracle 10g,db2 9.0或者更新的版本的话
不如考虑用xml把所有价格作为xml型数据放在商品表的里面,然后利用建立xml 索引,这样的话也就是
商品表里多个价格列而已,很方便的

我以前做过类似的开发关于权限管理的,sql2005 300多万的数据作还是可以的,当然服务器性能还是很重要的