当前位置:  编程技术>.net/c#/asp.net

c#相关文章的实现方法详解

    来源: 互联网  发布时间:2014-08-30

    本文导语:  现在流行的内容管理系统(cms)都提供相关文章的功能,不过,你有没有想过自己用c#(asp.net或vb.net)来实现相关文章的功能呢? 如果您正有此意,那么不妨望下看吧。 精彩的c#相关文章的旅程,由您而开启。 本文介绍的内容,...

现在流行的内容管理系统(cms)都提供相关文章的功能,不过,你有没有想过自己用c#(asp.net或vb.net)来实现相关文章的功能呢?
如果您正有此意,那么不妨望下看吧。

精彩的c#相关文章的旅程,由您而开启。

本文介绍的内容,由于允许关键字可以通过“,”分隔符号来定义多个,有点难度。
通过在保存文章的时候便分解关键字,建立一关键字表,把所有关键字逐个按对应的文章ID来保存。
并决定采用纯SQL存储过程的办法,因为这种重复的操作,与其用通用函数,倒不如用预编译的存储过程更加快,这样能把所有处理都留給SQL Server。

这里提供两种解决方案,供大家参考。

先来看方案1:
首选,在原有文章表(Details)的基础上建立相关文章表(RelatedDetails),字段包括ItemID(主键)、DetailID(文章ID)和Keyword(关键字)。
主要存储过程:
1、更新相关文章关键字 UpdateRelatedDetails:
 

代码示例:

CREATE procedure dbo.UpdateRelatedDetails

@DetailID INT,
@Keywords NVARCHAR(500)

AS
EXEC DeleteRelatedDetails @DetailID

DECLARE @I INT
DECLARE @Keyword NVARCHAR(50)

SET @Keywords=REPLACE(@Keywords,',', ',')
SET @Keywords=REPLACE(@Keywords,';', ',')
SET @Keywords=RTRIM(LTRIM(@Keywords))

SET @I=CHARINDEX(',', @Keywords)

WHILE @I>=1
BEGIN
SET @Keyword=LEFT(@Keywords, @I-1)
INSERT INTO DetailKeywords (DetailID, Keyword) VALUES(@DetailID, @Keyword)
SET @Keywords=SUBSTRING(@Keywords, @I+1,LEN(@Keywords)-@I)
SET @I=CHARINDEX(',', @Keywords)
END

IF @Keywords''
INSERT INTO DetailKeywords (DetailID, Keyword) VALUES(@DetailID, @Keywords)
GO

2、DeleteRelatedDetails:删除原有相关文章关键字
 

代码示例:

CREATE PROCEDURE dbo.DeleteRelatedDetails

@DetailID INT

AS

DELETE FROM DetailKeywords WHERE DetailID=@DetailID
GO

3、获取相关文章,其中Details就是文章表 GetRelatedDetails:
 

代码示例:

CREATE procedure dbo.GetRelatedDetails

@DetailID INT

AS
DECLARE @Keywords NVARCHAR(500)
SELECT @Keywords=Keywords FROM Details WHERE ItemID=@DetailID

IF @Keywords''
BEGIN
SELECT DISTINCT d.ItemID, d.Subject, d.ItemFile
FROM Details d RIGHT OUTER JOIN DetailKeywords k ON k.DetailID=d.ItemID WHERE d.ItemID @DetailID AND @Keywords LIKE '%'+k.Keyword+'%'
END
GO

继续我们的旅程,下面是有关方案2的介绍。

方案2:
原来的做法是文章表和关键字表,关键字表可能会存在大量重复的关键字,所以采用中间表,而关键字不再重复。

设计:首选要做的是在原有文章表(Details)的基础上建立关键字表(DetailKeywords),字段包括ItemID(主键)和Keyword(关键字),还有中间表DetailsKeywords,包括DetailID(文章ID)和KeywordID(关键字ID)。

主要存储过程:
1、更新关键字 UpdateRelatedDetails:
 

代码示例:

CREATE procedure dbo.UpdateRelatedDetails

@DetailID INT,
@Keywords NVARCHAR(500)

AS
SET NOCOUNT ON
EXEC DeleteRelatedDetails @DetailID

DECLARE @I INT
DECLARE @Keyword NVARCHAR(50)
DECLARE @KeywordID INT

SET @Keywords=REPLACE(@Keywords,',', ',')
SET @Keywords=REPLACE(@Keywords,';', ',')
SET @Keywords=RTRIM(LTRIM(@Keywords))

SET @I=CHARINDEX(',', @Keywords)

WHILE @I>=1
BEGIN
SET @Keyword=LEFT(@Keywords, @I-1)

EXEC AddRelatedDetailKeyword @DetailID, @Keyword

SET @Keywords=SUBSTRING(@Keywords, @I+1,LEN(@Keywords)-@I)
SET @I=CHARINDEX(',', @Keywords)
END

IF @Keywords''
EXEC AddRelatedDetailKeyword @DetailID, @Keywords

SET NOCOUNT OFF
GO

2、添加单个关键字 AddRelatedDetailKeyword:
 

代码示例:

CREATE procedure dbo.AddRelatedDetailKeyword

@DetailID INT,
@Keyword NVARCHAR(50)

AS

SET NOCOUNT ON

DECLARE @KeywordID INT

SELECT @KeywordID=ItemID FROM DetailKeywords WHERE Keyword=@Keyword

IF @KeywordID IS NULL
BEGIN
INSERT INTO DetailKeywords (Keyword) VALUES(@Keyword)
SET @KeywordID=IDENT_CURRENT('DetailKeywords')
END
INSERT INTO DetailsKeywords (DetailID, KeywordID) VALUES(@DetailID, @KeywordID)

SET NOCOUNT OFF
GO

3、删除之前的关键字,存在点问题 DeleteRelatedDetails:
 

代码示例:

CREATE PROCEDURE dbo.DeleteRelatedDetails

@DetailID INT
AS
SET NOCOUNT ON

--这里还有其它东西没有判断和删除
DELETE FROM DetailsKeywords WHERE DetailID=@DetailID

SET NOCOUNT OFF
GO

GetRelatedDetails:根据某文章ID获取相关文章
CREATE procedure dbo.GetRelatedDetails
@DetailID INT
AS

SELECT DISTINCT d.ItemID, d.Subject FROM Details d, DetailKeywords k, DetailsKeywords s
WHERE d.ItemID = s.DetailID AND k.ItemID=s.KeywordID AND d.ItemID@DetailID
GO

性能比较:
30万条记录,PIII 800+300多内存,硬盘是7200转:
--第1种,两表情况
--select a.* from Article a,ArtKey2 b
--where a.ArtID=b.ArtID and b.KeyValue='科技9'
--第2种,三表情况
--select a.* from Article a,ArtKey1 b,
--(select KeyID from KeyValue where KeyValue='科技9') c
--where a.ArtID=b.ArtID and b.KeyID=c.KeyID
--第3种,三表情况
--select * from Article where ArtID in
--(select ArtID from ArtKey1 where KeyID in
--(select KeyID from KeyValue where KeyValue='科技9'))

优化Sql语句,其实主要是通过在“执行计划”图所显示的IO成本,以及cpu成本来分析执行效率。
在SQL查询分析器的执行计划中,IO成本+CPU成本=本步成本。

三个sql在同一批处理中的执行结果:
1、占14.22%,实际执行成本为2.96。
2、占43.08%,实际执行成本为9.96。
3、占42.70%,实际执行成本为8.88。
说明:
第一种执行成本远小于后者,且执行计划也比后者简洁得多,显然第一种要优于其它两种。
执行计划简洁不是优越的标准,但SQL语句写得不够简洁,通常是为了满足业务需求不得已写出复杂语句。
第2种与种3种的执行计划只是在最后一步不同,前者是inner join,后者是Right Semi Join。

好了,关于c#相关文章的实现方法就介绍到这里,肯定还有更好的方法,欢迎大家多多交流。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 想在linux下用C实现gzip压缩与解压缩,有没有相关库函数可以调用?
  • 请问两个毫不相关的程序,怎样实现通信
  • 请问哪里能找到netfilter的connection tracking的实现或源吗分析的相关文章。
  • 问一个菜菜问题:ant的实现机制,已经相关资料:)
  • 跪求:数字图像的小波提升算法与实现 的相关资料
  • 我是java新手,请问java中与平台相关的操作是怎样实现的
  • 想在windows2000下安装Solaris 9,可以采用什么方法实现及相关的配置要求,最好是给点说明性的资料,谢谢了
  • 在APPLET中如何实现对磁盘文件的读写,如有办法请给一个相关代码!请求帮助!一定给分!
  • Android点亮屏幕或屏幕解锁和锁定以及其他相关权限实现代码
  • 不使用semget等信号量相关的函数如何实现多个进程对同一个文件的访问
  • Android实现获取应用程序相关信息列表的方法
  • PHP简单实现“相关文章推荐”功能的方法
  • 请问LINUX的系统实现源代码在那个目录下啊,找了好久没找到相关C或CPP文件哪
  • java中如何实现基于c/s的文件上载??做个相关工作的朋友来帮个忙吧
  • IE11设置IE兼容性视图及提升Windows 8.1中IE11兼容性的相关设置
  • 请问Solaris的优势?Solaris下开发相关及系统管理相关资料是否有提供?谢谢
  • Ubuntu查看硬盘,分区相关命令介绍
  • WordPress相关日志插件 Wordpress Related Posts
  • MyEclipse如何查看和设置文件编码格式相关操作
  • 请问:查询域名解决MX记录的相关API
  • Java中多线程相关类Thread介绍
  • 求助!!!Java 相关资料。
  • 基于Key-Value的NOSQL数据库Redis的数据结构及常用相关命令介绍
  • 2.6.0内核编译时,遇到的modules相关问题
  • windows下文件名非法字符及相关命令
  • 有使用过Iax2协议的么?求相关资料
  • nginx Windows版相关问题及使用说明
  • 驱动模块中用socket,哪有相关的函数啊??
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • vim 搜索功能相关
  • ASP.NET之 Ajax相关知识介绍及组件图


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3