数据库课程设计旅行社管理系统_第1页
数据库课程设计旅行社管理系统_第2页
数据库课程设计旅行社管理系统_第3页
数据库课程设计旅行社管理系统_第4页
数据库课程设计旅行社管理系统_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据库课程设计旅行社管理系统目录错误!未定义书签。第一章:概述 31.1 开发环境 31.2 项目描述 31.3 主要的需求和问题 41.4 主要功能 51.5 ER 模型图 61.6 业务流程图 10第二章:详细设计 112.1 数据库 112.2 数据表 112.3 建立约束 172.3.1 建立默认约束 172.3.2 建立 CHECK (检查约束) 172.4 建立触发器 192.5 插入数据 232.6 建立视图 262.7 建立存储过程 30第三章:功能测试与实现 31- 5 -3.1 触发器测试 31心得体会 35参考文献 36附录: 37第一章:概述1.1 开发环境本系统采用

2、SQL server 2008作为主要开发工具,并在 Windows 7 环境下开发。1.2 项目描述设计题目七:旅行社数据库(题目等级 60)* 旅行社是一家综合性的国内旅游企业。自一九九五年成立以来, * 正旅主业已 完成了从单一本地旅游向大旅游转变的战略调整,形成了国内旅游、票务销售、住宿服 务、咨询服务并举的发展格局。 * 旅行社拥有近百名翻译导游人员,每年都要接待近 十万名来自全国各地的观光游客,并与各地区的旅游界、友好团体建立了紧密的业务联 系。* 旅行社为各地区旅游者提供可供选择的中国各地观光日程及游览节目,并致力 为客人安排有益、舒适、愉快的旅程,提供一流的服务。烹饪学习 、书

3、法绘画 、古迹探访 等特色旅游节目, 以及修学 、保健、气功及会议旅游和 艺术公演团体 、 体育、医学交流团体 等旅游安排,深受旅游者的青睐。在新的时期下,现有的管理系统已经远远不能满足公司的需求,因此必须对原有的 管理系统进行进一步的改进和完善,使之更好地为公司服务。为使信息系统的建设不至 盲目,公司决定对该系统建设进行前期规划。在这里,我们将对公司的系统建设,作一 个前期的规划。以下是我们对数据库的具体设计要求:旅行社的数据库包括旅游信息, 票务信息, 住宿信息、客户信息以及人员信息等等。 旅游信息 -游程:这里包括景点介绍,行程安排、人员和费用。票务信息:这里包括各个航空公司、铁路公司以

4、及客运公司的票务信息。其中的票 务代理信息可以供旅客参考,方便回程订票。住宿信息:这里包括各个旅游景点的各种档次的饭店、招待所的信息。方便我们从 中选择制定费用。人员信息:这里分为 2 类,一是旅行社内精通各地语言的导游,可以根据不同要求 选择;二是旅行社里的其他工作人员,我们就不做细分。客户信息:这里有新老客户的信息。1.3 主要的需求和问题* 旅行社需要建立一个管理数据库存储以下信息:* 旅行社中主要的实体有员工、客户、住宿信息、票务信息、游程信息、旅游团、 旅行社。* 旅行社有多名员工, 每个员工包含有员工编号、 员工姓名、 员工性别、员工年龄、 员工性质(导游 /其他)、员工身份证号、

5、员工联系电话。* 旅行社包含多名客户,每个客户包含有客户编号、客户姓名、客户性别、客户年 龄、客户性质(新 /老)、客户身份证号、客户联系电话。* 旅行社开设多个旅行团,每个旅行团包含旅行团编号、旅行团名称、开始时间、 结束时间、人数、旅游城市。一个旅行团可以决定多条游程, 每条游程信息包含游程编号、 游程名称、游程时间、 日期、景点介绍。一个旅行团可以安排多个住宿酒店,每个住宿信息包含酒店编号、酒店名称、酒店 星级、价格、酒店地址。一个旅行团可以选择多条票务信息,每条票务信息包含票务编号、票务名称、车次 /航班、价格、起点、终点、出发时间、到达时间。1.4主要功能基础信息操作:员工信息、客户

6、信息、旅游团信息、游程信息、住宿信息、票务信息的插入更新删 除。数据查询:基本信息查询、按条件查询、多表信息查询。数据统计:详细统计各表的数据。旅游团信息.导游信息基础信息操作人员信息住宿信息旅游信息票务信息景点信息正大旅行社数据库查询操作统计操作图1.4.1系统功能图基本查询4按条件查询多表查询各表信息-15 -1.5 ER模型图N人员图1.5.1 E.R 模型图员工编号员工姓名员工性质员工性别 | . y -77 员工员工电话员工身份证员工年龄VuX /J图1.5.2 员工实体图客尸客户身份证客户电话客户年龄客户编号客户姓名客户性质客户性别1.5.3 客户实体图旅行社编号旅行社名称成立时间

7、正大旅行社C 地址、(联系电话): 简介图1.5.4旅行社实体图图1.5.6游程实体图住宿图1.5.7住宿实体图/图1.5.8票务实体图1.6业务流程图人数不够4、2、3、说明接团地点、方式 导游协商接团结算问题 确定团队细节团队赠送、购物安排定房、定餐、定车、 定导游、定返程交通反馈旅客,不进行组团确认组团1、再次确认车、房、餐、 交通是否预定好 联系具体人数,看有 无产生自然单间 确认准备措施是否做 好派团、给导游下计划接团前准备团队进行中的监控送团4、2、3、财务部综合各种收入支出做出财务报表,以便旅行社负责人全盘 掌控做好总结工作图1.6.1*旅行社业务流程图1、说明团队注意事、 项2

8、、单男、单女解决 问题3、结算问题(自行 车一般现收费)4、说明可能出现的- 问题,如何解决丿了解团队情况看望全陪 做好总结工作开好发票第二章:详细设计2.1数据库代码:-建立数据库ZDCREATE DATABASE ZD ON PRIMARY(NAME=ZD_data ,FILENAME =D:DatabaseZDZD_DBdata.mdfSIZE =5120 KB,MAXSIZE =30 MB,FILEGROWTH =5%)LOG ON(NAME=ZD_log ,FILENAME =D:DatabaseZDZD_DBlog.ldfSIZE =1024 KB,MAXSIZE =10 MB,F

9、ILEGROWTH = 10 %)2.2数据表表2.2.1员工信息表字段名中文对照数据类型主键非空唯一外键Sd员工编号nCHAR(8)是是是否S Name员工姓名VARCHAR(20)否是否否S Sex员工性别CHAR(2)否是否否S Age员工年龄SMALLINT:否是否否S Nature员工性质VARCHAR(10)否是否否S Idcard身份证号”CHAR(20)否是是否S Contact联系方式ICHAR(11)否是是否表2.2.2 客户信息表字段名中文对照数据类型主键非空唯一外键Cd客户编号CHAR(8)是是是否C Name客户姓名VARCHAR(20)否是否否C Sex客户性别CH

10、AR(2)否是否否C Age客户年龄SMALLINT否是否否C Nature客户性质VARCHAR(10)否是否否Cdcard身份证号CHAR(20)否是是否C Co ntact联系方式CHAR(11)否是是否表2.2.3旅行社信息表字段名中文对照数据类型主键非空唯一外键ZD ld旅行社编号CHAR(8)是是是否ZD Name旅行社名称VARCHAR(20)否是否否ZD I ntro旅行社介绍VARCHAR(300)否是否否ZD Adds旅行社地址CHAR(20)否是否否ZD Stime成立时间DATE否是是否ZD Co ntct联系电话CHAR(11)否是否否表2.2.4旅行团信息表字段名中

11、文对照数据类型主键非空唯一外键G Id旅行团编号CHAR(8)是是是否G Name旅行团名称VARCHAR(20)否是否否G Stime开始时间DATE否是是否G Etime结束时间DATE否是是否G Cou nt人数INT否是否否ZD Id旅行社编号CHAR(8)否是是是G City城市VARCHAR(10)否是是否表2.2.5游程信息表字段名中文对照数据类型主键非空唯一外键T Id游程编号CHAR(8)是是是:否IT Name游程名称VARCHAR(20)否是否否T Sight景点介绍VARCHAR(300)否是否否T Time游程时间DATE否是是T City游程城市VARCHAR(10

12、)否是是否226aa?BH1HsH LevelH1H1毋连raujnCHAR(20)VARCHAR(10)VARCHAR(20)ITTTST1T1T 1m p.T 1SST1TT 1OCDT1Epwt pwssssSSujnDATETIMEDATETIMECHAR(20)CHAR(20)VARCHAR(IO)VARCHAR(20)TTTS227 汨蹿a?B代码:-在数据库ZD中建立数据表-(1 )建立旅行社表(ZD_zd)CREATE TABLE ZD_zd(ZD_Id char ( 8) primary key ,-旅行社编号 ZD_Name varchar ( 20 )notnull,-旅

13、行社名称ZD_Introvarchar ( 300 ),-旅行社介绍ZD_Stime date ,-旅行社成立时间ZD_Adds char ( 20 )not null ,-旅行社地址 ZD_Contct char (11) not null -联系电话 );-(2)建立旅行团表(ZD_group )CREATE TABLE ZD_groupIGd ctiar (8)primarykey ,-旅行团编号G_Namevarchar(20 ) not null,-旅行团名称G_Stimedatenot null,-旅行团开始时间G_Etimedatenot null,-旅行团结束时间G_Cou n

14、tint ,-旅行团人数ZD_Idchar ( 8),-旅行社编号foreig nkey ( ZD_Id ) referencesZD_zd ( ZD_Id )-夕卜键约束-42 -);-(3)建立游程表(ZD_travel )CREATE TABLE ZD_travel(T_Id char (8) primary key ,-游程编号 T_Name varchar (20) not null,-游程名称T_Sight varchar ( 300 ),-景点介绍T_Time date not null,-游程时间T_City varchar (10)-游程城市);-(4)建立员工表(ZD_st

15、aff )CREATE TABLE ZD_staff(S_Id char (8) PRIMARY KEY,-员工编号S_Name VARCHAR( 20 ) NOT NULL,-员工姓名S_Nature varchar ( 10),-员工性质S_Sex char ( 2) NOT NULL,-员工性别S_Age smallint,-员工年龄S_Idcard char ( 20 )not null unique ,-员工身份证号 S_Contact char ( 11 ) NOT NULL UNIQUE,-员工的联系电话 );-(5)建立客户表(ZD_clie nt )CREATE TABLE

16、ZD client(C_Id char (8) PRIMARY KEY,-客户编号C_Name VARCHAR( 20 ) NOTC_Nature varchar ( 10),-C_Sex char ( 2)C_Age smalli ntC Idcard char(20)notC_Contactchar (11)NULL,-客户姓名客户性质-客户性别NOT NULL,-客户年龄null unique ,-客户身份证号NOT NULL UNIQUE,-客户的联系电话hotel )ZD hotelHd char (8)H Namevarcharprimary(20)notvarchar ( 10)

17、char ( 20 )not iH_Contact char (11) i);-(7)建立票务表(ZD_CREATE TABLEH LevelH Addsnullnotkey ,-酒店编号:null,-酒店名称-酒店星级,-酒店地址null-联系电话ticketZD ticket);-(6)建立住宿表(ZD_ICREATE TABLETldchar ( 8) primarykey ,-票务编号Tl_Costmoney notn ull,-票价Tl_Numbervarchar(20),-车次/航班Tl_Naturevarchar(10),-票务性质Tl_Startchar ( 20)not nu

18、ll,-起点Tl_End char ( 20 )notnull-终占k、八、Tl_Stimedatetimenotnull,-岀发时间Tl_Etimedatetimenotnull,-到达时间();-(8)建立决定表(CREATE TABLEZD decideZDdecideG IdT Idforeig nchar ( 8) char ( 8),key ( G_Id,-旅行团编号-游程编号)referencesforeig n);key (T_Id)referencesZD_group ( Gd ),-夕卜键约束ZD_travel ( T_Id )-夕卜键约束建立陪同表(ZD_accompa

19、ny-(9)CREATE TABLE ZD_accompany(G Idchar (8)旅行团编号H IdAR Timechar ( 8)datenot酒店编号null,-入住时间foreig n foreig n);key ( G_Id key ( H_Idrefere ncesrefere ncesZD_group ZD hotel(G_Id(H_Id),-夕卜键约束 )-外键约束-(11 )CREATE建立选择表(TABLE ZD_optionZD_optio nG IdTI Idchar ( 8),-char ( 8),-旅行团编号票务编号foreig n foreig n);key

20、( Gdkey ( TI_Id ) references)referencesZD_groupZD ticket(G_Id(TI_Id),外键约束)-外键约束-(12 )CREATE建立报名表(ZD_apply TABLEZD_applyG Idchar ( 8),C IdcharAP Time(8),date-旅行团编号-客户编旦notAP Costforeig nforeig nchar ( 8) key ( G_Id key ( C_Id号n ull,not n ull,-报名时间-报名费用)references)referencesZD_group ZD Clie nt(G_Id ),

21、(C_ld )外键约束外键约束(Gd char (8),-旅行团编号S_Id char (8),-导游编号A_Accodate notnull,-陪同时间foreig nkey ( G_Id)referencesZD_group ( G_Id ),-外键约束foreig nkey (S_Id)referencesZD_staff ( S_Id )-外键约束力-(10)建立安排表(ZD_arra nge)CREATE TABLE ZD_arrange-设备编号NULL,-设备类型);LCET_ld INT PRIMARY KEY, LCET_Type VARCHAR( 50 ) NOTLCET_

22、Lice nee VARCHAR( 50 ) NOT NULL UNIQUE,-车牌号 LCET_Status VARCHAR( 50) NOT NULL,-设备状态 LCET_Usage VARCHAR(50) NOT NULL,-使用情况);2.3建立约束2.3.1建立默认约束代码:-在数据库建立默认CREATE DEFAULTZD_Sex AS 男CREATE DEFAULTZD_Age AS 20-将默认绑定到列EXEC sp_bindefaultZD_Sex,ZD_staff.S_SexEXEC sp_bindefaultZD_Age,ZD_staff.S_AgeEXEC sp_bi

23、ndefaultZD_Sex,ZD_client.C_SexEXEC sp_bindefaultZD_Age,ZD_client.C_Age2.3.2建立CHECK (检查约束)-(1 )在表 ZD_staff 上建立 CHECK (检查约束) chk_zd_1 ALTER TABLE ZD_staff ADDCONSTRAINT chk_zd_1CHECK( S_Nature IN (导游,其他);-(2)在表 ZD_staff 上建立 CHECK (检查约束) chk_zd_2 ALTER TABLE ZD_staffADDCONSTRAINT chk_zd_2CHECK( S_Sex I

24、N (男,女);-(3)在表 ZD_staff 上建立 CHECK (检查约束) chk_zd_3 ALTER TABLE ZD_staffADDCONSTRAINT chk_zd_3CHECK( LEN( S_Idcard )= 18);-(4)在表 ZD_staff 上建立 CHECK (检查约束) chk_zd_4 ALTER TABLE ZD_staffADDCONSTRAINT chk_zd_4-(5)在表 ZD_client上建立 CHECK (检查约束) chk_zd_5ALTER TABLE ZD_clientADDCONSTRAINT chk_zd_5CHECK( C_Nat

25、ure IN (新,老);-(6)在表 ZD_client上建立 CHECK (检查约束) chk_zd_6ALTER TABLE ZD_clientADDCONSTRAINT chk_zd_6CHECK( C_Sex IN (男,女);-(7)在表 ZD_client上建立 CHECK (检查约束) chk_zd_7ALTER TABLE ZD_clientADDCONSTRAINT chk_zd_7CHECK( LEN( C_ldcard )= 18 );-(8)在表 ZD_client上建立 CHECK (检查约束) chk_zd_8ALTER TABLE ZD_clientADDCON

26、STRAINT chk_zd_8CHECK( LEN ( C_C on tact)= 11 );-(9)在表 ZD_hotel 上建立 CHECK (检查约束) chk_zd_9ALTER TABLE ZD_hotelADDCONSTRAINT chk_zd_9CHECK( H_Level IN ( 一,二,三:四,五);-(10 )在表 ZD_ticket 上建立 CHECK (检查约束) chk_zd_10ALTER TABLE ZD_ticketADDCONSTRAINT chk_zd_10CHECK( TI_Nature IN (火车票,汽车票,飞机票);2.4建立触发器代码:(1 )

27、建立触发器,不允许向ZD_zd表中插入数据createtriggertrigger_1on ZD_ in steadas_zdof in sertbeginselectend不允许向旅行社表中插入数据as 失败原因go-(2)建立触发器,不允许开始时间大于结束时间-drop trigger trigger_2createtriggertrigger_2on ZD_groupafterin sertasbeginselectG_Stime , G_Etimefromin sertedif G_Stime = G_Etime beginselect rollback end时间输入错误,请检查as

28、 失败原因tran sacti onendgo-(3)建立触发器,不允许员工年龄小于或大于-drop trigger trigger_3createtriggertrigger_3on ZD_staffafterin sertas beginselectS_Agefromin sertedif S_Age not betwee n18 and 50beginselect 年龄输入错误,请检查as 失败原因rollbacktran sacti onendendgo-(4)建立触发器,不允许客户小于或大于-drop trigger trigger_4create trigger trigger_4

29、on ZD_clientafterin sertasbeginselect C_Agefromin sertedif C_Age not betwee n 18 and 50beginselect 年龄输入错误,请检查as 失败原因rollbacktran sacti onendendgo-(5 )在ZD_decide 上建立触发器,确保数据的正确关联-drop trigger trigger_5create trigger trigger_5on ZD_decideafterin sertasbegindeclarebl1char(8)=( selectG_Id fromin serted)

30、declarebl2char(8)=( selectT_Id fromin serted)declarebl3date=(selectT_TimefromZD_travelwhereT_Id =bl2 )declarebl4date=(selectG_StimefromZD_groupwhereGd =bl1 )declarebl5date=(selectG_EtimefromZD_groupwhereGd =bl1 )declarebl6varchar (10 )=(selectG_Cityfrom ZD_groupwhereGd =bl1 )declarebl7varchar (10 )=

31、(selectT_Cityfrom ZD_travelwhereT_Id =bl2 )if bl3 bl5 or bl6 bl7 beginselect 信息不匹配as 失败原因rollbacktran sacti onendendgo-(6 )在ZD_accompany 上建立触发器,确保数据的正确关联-drop trigger trigger_6create trigger trigger_6on ZD_accompanyafterin sertasdeclarebl1char(8)=( selectG_Idfromin serted)declarebl2date=(selectA_Acc

32、ofromin serted)declarebl4date=(selectG_StimefromZD_groupwhereG_Id =bl1declarebl5date=(selectG_EtimefromZD_groupwhereG_Id =bl1begin)if bl2 bl5beginselect 信息不匹配as 失败原因rollbacktran sacti onendendgo-(7 )在ZD_arrange上建立触发器,确保数据的正确关联-drop trigger trigger_7createtriggertrigger_7on ZD_arrangeafterin sertasbe

33、gindeclarebl1char(8)=( selectG_Idfromin serted)declarebl2date=(selectAR_Timefromin serted)declarebl4date=(selectG_StimefromZD_groupwheredeclarebl5date=(selectG_EtimefromZD_groupwhereif bl2 bl5beginselect信息不匹配as 失败原因rollbacktran sacti onGd =bl1 )Gd =bl1 )endendgo-(8 )在ZD_apply 上建立触发器,确保数据的正确关联-drop t

34、rigger trigger_8create trigger trigger_8on ZD_applyafterin sertasbegindeclarebl1char(8)=( selectG_ldfromin serted)declarebl2date=(selectAP_Timefromin serted)declarebl4date=(selectG_StimefromZD_groupwhere Gd =bl1 )if bl2 = bl4beginselect 信息不匹配as 失败原因rollbacktran sacti onendendgo2.5插入数据代码:INSERTINTO Z

35、D_zdVALUES(Z100,正大旅行社,上海正大旅行社是一家综合性的国内旅游企业。,1995-01-01,上海;INSERTINTO ZD_groupVALUES(0001,成都单人两天游,20130101,20130102,10,Z100),(0002,包头单人两天游,20130101,20130102,10,Z100),(0003,成都单人两天游,20130102,20130103,10,Z100),(0004,包头单人两天游,20130102,20130103,10,Z100),(0005,成都单人两天游,20130201,20130202,10,Z100)

36、,(0006,包头单人两天游,20130201,20130202,10,Z100);INSERTINTO ZD_travelVALUES(0001,参观成都景点,成都景点.,20130101J成都),(0002,参观成都景点,成都景点.,20130102J成都),(0003,参观成都景点,成都景点.,20130103J成都),(0004,参观包头景点,包头景点.,20130101J包头),(0005,参观包头景点,包头景点.,20130102J包头),(0006,参观包头景点,包头景点.,20130103J包头),(0007,参观成都景点,成都景点.,20130201J成都),(0008,参观

37、成都景点,成都景点.,20130202J成都),(0009,参观包头景点,包头景点.,20130201J包头),(0010,参观包头景点,包头景点.,20130202J包头);INSERTINTO ZD_staffVALUES(D001,张毅,导游,男,21 , 510912349209098768,(D002,李毅,导游,男,28 , 510902599019098768,(D003,家明,导游,女,21 , 510923409009098768,(D004,阿牛,导游,男,23 , 510902510030909

38、876,(Q001,蔡依林,其他,女,21 ,510904098209098788,(Q002,林俊杰,其他,男,27 ,510905456209098778,(Q003,吴克羣,其他,男,30,(Q004,林俊杰,其他,男,27 ,510901456209198778;INSERTINTO ZD_clie ntVALUES(0001,小张,新,男,21 , 510912349209568761,(0

39、002,小张,老,女,28,(0003,小张,新,男,21 , 510912349209568763,(0004,小张,老,女,28,(0005,小张,新,男,21 , 510912349209568765,(0006,小张,老,女,28 ,(0007,小张,新,男,21 , 510912349209568767,(000

40、8,小张,老,女,28 ,(0009,小张,新,男,21 , 510912349209568769,(0010,小张,老,女,28;(0041,小吕,新,男,21 , 510912349209568751,(0042,小吕,老,女,28,(0043,小吕,新,男,21 , 510912349209568753,(0044,

41、小吕,老,女,28;INSERTINTO ZD_hotelVALUES(0001,花儿酒店,一,成都什么路,(0002,安心酒店,二,成都什么路,(0003,寝宫酒店,四,成都什么路,(0004,云山酒店,三,包头什么路,(0005,浅语酒店,五,包头什么路,(0006,华山酒店,三,包头什么路,(0007,小心酒店,二,成都什么路,(0008,飞宫

42、酒店,四,成都什么路,(0009,闫山酒店,三,包头什么路,(0010,于语酒店,五,包头什么路;INSERT INTO ZD_ticketVALUES(H0001, 123 , k1509,火车票,成都起点,成都终点,2013-01-0107:00:00, 2013-01-01 08:00:00),(H0002, 333 , d2345,火车票,成都起点,成都起点,2013-01-0207:00:00, 2013-01-02 08:00:00),(Q0001, 235 , 1234,汽车票,成都起点,成都起点,2013-01-0308:00:00, 2013-01-03 09:12:12),(H0003, 123 , k1609,火车票,包头起点,包头终点,2013-01-0107:00:00, 2013-01-01 08:00:00),(H0004, 333 , d2645,火车票,包头起点,包头起点,2013-01-0207:00:00, 2013-01-02 08:00:00),(Q0002,235 , 1284,汽车票,包头起点,包头起点,2013-01-0308:00:00,2013-01-03 09:12:12),(H0005,333 , d2745,火车票

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论