楼主: fan0124

[SQL] 【讨论】关于数据层用不用存储过程封装的问题?

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
61#
发表于 2012-7-30 07:29 | 只看该作者
yulihua49 发表于 2012-7-29 09:41
北京地铁清分系统。
根据UD(User Data)就是交易记录,得知进站(O)、进站时间、出站(D)、出站时间。
...

你这“层次模型”不就是规范化的关系模型?就是把原来一张表拆成两张而已,把你的“指针”理解为一个列,就是典型的关系表。
对于纯内存计算,存储过程和C相比处于下风。但是这可以通过优化设计来弥补。比如这个清算的很多计算,应该和计费模块重复的,在生成交易记录的时候就可以算好(此时只计算单笔交易,存储过程完全胜任),这样就减轻清算的负担。等计算逻辑简化为表连接,SQL的优势就体现出来了。
存储过程也可以并行调用,比如你这500万数据之间没什么联系,完全可以交给多个进程来同时完成。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
62#
发表于 2012-7-31 17:24 | 只看该作者
newkid 发表于 2012-7-30 07:29
你这“层次模型”不就是规范化的关系模型?就是把原来一张表拆成两张而已,把你的“指针”理解为一个列, ...

回答问题1:
不可能在交易期间进行清分计算,刷卡时给数据库操作的时间不超过0.1秒,能把交易记录下来就不简单了。
刷卡是在运营单位,而运行图在行车单位,不是一个单位,刷卡时得不到路由表、运行图。只有双方把数据报到总公司才有可能清算。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
63#
发表于 2012-7-31 17:27 | 只看该作者
本帖最后由 yulihua49 于 2012-7-31 18:06 编辑
newkid 发表于 2012-7-30 07:29
你这“层次模型”不就是规范化的关系模型?就是把原来一张表拆成两张而已,把你的“指针”理解为一个列, ...


回答问题2:
你看着象关系,就是关系啊?!
这个可以用主-细关系模型来构建。
在关系模型中,存储的位置和次序都是不靠谱的,所以必须要用外键进行主-细关联。要在第二层增加外键。
这就带来一个问题,必须再进行一次检索才能找到主表。事情还没有完,找到主表后还要进行N次查询才能找到所有停靠站。不管在内存,或者用SQL,一个SQL语句或多个SQL语句完成这个查询,这3步操作都是必不可少的,效率何在?
我这个数据,不符合第一范式,如何能说他是关系?
数据的摆放位置和次序与数据逻辑有关。第一范式要求无关。要求属性是简单数据类型。
每层数据不完整,多层数据组合成完整记录。第一范式要求所有元组具有相同属性,就是每个元组都是完整记录。
数据存储时是有序数组,查询后无需排序。第一范式要求存储的次序与结果的正确性无关,如结果要求次序可以在结果集安排一个排序。
关系不允许出现指针,没有指针就要用一个查询来代替。

另外,关系与层次的处理不同,关系在调入内存时只需要平铺。
而层次需要组织分组、节点、勾连,树等等。





使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
64#
发表于 2012-7-31 22:17 | 只看该作者
ORACLE支持嵌套表,一个列可以是一个数组;他们把这叫做对象模型,底层实现还是用关系表。进入内存后应该就变成指针了。我不确定这能否满足你说的这些需求。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
65#
发表于 2012-8-1 17:51 | 只看该作者
newkid 发表于 2012-7-31 22:17
ORACLE支持嵌套表,一个列可以是一个数组;他们把这叫做对象模型,底层实现还是用关系表。进入内存后应该就 ...

如何设计这种列?能举例否?

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
66#
发表于 2012-8-1 23:40 | 只看该作者
例子:线号表里面带一个停靠站的数组。这个指针是单向的,我还搞不清楚你的指针来回指到底做什么用。

CREATE TYPE T_STOP AS OBJECT (
       STOP_ID     NUMBER
      ,STOP_NAME   VARCHAR2(20)
      )
/

CREATE TYPE T_STOP_VARRAY AS VARRAY(100) OF T_STOP
/


CREATE TABLE SUBWAY_LINES (
       LINE_NO    NUMBER
      ,TRAIN_NO   VARCHAR2(10)
      ,DIRECTION  NUMBER
      ,NUM_STOPS  NUMBER
      ,STOPS      T_STOP_VARRAY
      )
/

INSERT INTO SUBWAY_LINES(LINE_NO,TRAIN_NO,DIRECTION,NUM_STOPS,STOPS) VALUES (1,'TRAIN#1',1,4,T_STOP_VARRAY(T_STOP(1,'STOP1'),T_STOP(2,'STOP2'),T_STOP(3,'STOP3'),T_STOP(4,'STOP4')));
COMMIT;

ORACLE用这种设计来实现关系模型做不到的需求,比如GIS里的几何运算(SPATIAL)等。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
67#
发表于 2012-8-2 15:58 | 只看该作者
本帖最后由 yulihua49 于 2012-8-2 21:36 编辑
newkid 发表于 2012-8-1 23:40
例子:线号表里面带一个停靠站的数组。这个指针是单向的,我还搞不清楚你的指针来回指到底做什么用。

CR ...


这个很有意思,多谢。
那么OBJ里的东西,可以在SQL里检索吗?
CREATE TYPE T_STOP AS OBJECT (
       STATION_ID     NUMBER
      ,arr_time   date
      ,STOP_time NUMBER(4)
      )

select * from my_table where T_stop_array(t_stop.station_id=the_station and t_stop.arr_time<the_time);...... 不行,表达不清。
好像这个东西只能存取,不能检索。
这个结构似乎已经是层次的了,可是不能进行层次操作。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
68#
发表于 2012-8-2 23:17 | 只看该作者
必须用TABLE()函数展开,它就会变成子表和父表连到一起。没办法单独对这个子表查询。

在上例再增加一行:
INSERT INTO SUBWAY_LINES(LINE_NO,TRAIN_NO,DIRECTION,NUM_STOPS,STOPS) VALUES (2,'TRAIN#2',0,3,T_STOP_VARRAY(T_STOP(1,'STOP1'),T_STOP(2,'STOP2'),T_STOP(3,'STOP3')));
COMMIT;

SELECT A.LINE_NO,A.TRAIN_NO,A.DIRECTION,A.NUM_STOPS,B.STOP_ID,B.STOP_NAME FROM SUBWAY_LINES A,TABLE(A.STOPS) B;

   LINE_NO TRAIN_NO    DIRECTION  NUM_STOPS    STOP_ID STOP_NAME
---------- ---------- ---------- ---------- ---------- ----------------
         2 TRAIN#2             0          3          1 STOP1
         2 TRAIN#2             0          3          2 STOP2
         2 TRAIN#2             0          3          3 STOP3
         1 TRAIN#1             1          4          1 STOP1
         1 TRAIN#1             1          4          2 STOP2
         1 TRAIN#1             1          4          3 STOP3
         1 TRAIN#1             1          4          4 STOP4

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
69#
发表于 2012-8-3 21:33 | 只看该作者
本帖最后由 yulihua49 于 2012-8-3 21:38 编辑
newkid 发表于 2012-8-2 23:17
必须用TABLE()函数展开,它就会变成子表和父表连到一起。没办法单独对这个子表查询。

在上例再增加一行: ...


SELECT A.LINE_NO,A.TRAIN_NO,A.DIRECTION,A.NUM_STOPS,B.STOP_ID,B.STOP_NAME FROM SUBWAY_LINES A,TABLE(A.STOPS) B WHERE  B.STATION_ID=:STATION_ID AND B.ARR_TIME >= :ARR_TIME
这样可以从子层检索吧?能建索引吗?

大侠就是大侠,谢过了。
虽然这次用不上这个,但毕竟是一种有用的方法。


使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
70#
发表于 2012-8-4 02:47 | 只看该作者
索引是可以建的,我从来没这么用过,得去查一下文档语法怎么写。
我怀疑最后还是拆成两张表存储,下周有空验证一下。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表