极具挑战的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 @GOODSSELECT 1,'可乐'UNION ALLSELECT 2,'雪碧'DECLARE @GOODS_PRICE TABLE(GOODSID INT,AREA NVARCHAR(50),PRICETYPE NVARCHAR(50) ,PRICE NUMERIC(19,6))INSERT INTO @GOODS_PRICESELECT 1,'北京','价格1',1.11UNION ALLSELECT 1,'北京','价格2',2.22UNION ALLSELECT 1,'上海','价格1',3.33UNION ALLSELECT 1,'上海','价格2',4.44UNION ALLSELECT 2,'北京','价格1',5.55UNION ALLSELECT 2,'北京','价格2',6.66UNION ALLSELECT 2,'上海','价格1',7.77UNION ALLSELECT 2,'上海','价格2',8.88SELECT GS.GOODSID,GS.GOODSNAME,GP.AREA,GP.PRICETYPE,GP.PRICEFROM @GOODS GSLEFT JOIN @GOODS_PRICE GPON GS.GOODSID=GP.GOODSIDORDER BY GS.GOODSID,GP.AREA,GP.PRICETYPE,GP.PRICE/*1 可乐 北京 价格1 1.1100001 可乐 北京 价格2 2.2200001 可乐 上海 价格1 3.3300001 可乐 上海 价格2 4.4400002 雪碧 北京 价格1 5.5500002 雪碧 北京 价格2 6.6600002 雪碧 上海 价格1 7.7700002 雪碧 上海 价格2 8.880000*/
[解决办法]
[解决办法]
我觉得应该首先有每个商品有一个基础价格,任何一个价格都是在这个价格之上的一个百分比,对于不同的地区,使用的是某几种百分比,数据库里面不要存放商品价格,所有商品价格都是基础价格根据百分比计算出来的,不同地区和不同的百分比可以组成多种价格方案,
就想了这么多,
[解决办法]
从传统的数据库设计来看无非就是 扩展列或者行,讨论来讨论去的 有什么意思
楼主如果用的是新的数据库引擎的话sql2005 ,oracle 10g,db2 9.0或者更新的版本的话
不如考虑用xml把所有价格作为xml型数据放在商品表的里面,然后利用建立xml 索引,这样的话也就是
商品表里多个价格列而已,很方便的
我以前做过类似的开发关于权限管理的,sql2005 300多万的数据作还是可以的,当然服务器性能还是很重要的