2010-05-25 198 views

回答

4

我不会直接处理说明列 - 关于选择的每行功能很少能很好地扩展。我订阅的准则之一是不需要在列内处理东西(类似于您的案例中的描述,或逗号分隔变量列的部分或甚至名称(第一/最后)和地址(街道/城镇/州) 组件)。如果你这样做,通常是更有效的方法。

我会做的是在表上插入,更新和删除触发器。对于插入/更新触发器,我会填充沿着DescLookup下面几行另一个表:

Movies: 
    Id primary key 
    Title 
    Description 
DescLookup: 
    Word 
    MovieId foreign key Movies(Id) 
    Count 
    primary key (Word,MovieId) 
    index (MovieId) 

基本上,在描述(每个非干扰词即打折之类的东西andorby,标点符号,单字母单词等),您会在此表中获得一个条目(使用较低的单词)。

确保触发器在重新填充之前删除该MovieId的所有当前行,以免留下不正确的信息。

然后您使用该表来运行您的查询。这会将查找单词的“成本”移动到插入/更新中,而不是每一次选择,都会大大降低成本。这很有效,因为大部分数据库的读取次数远远多于写入次数,所以将成本转移到写入部分是个不错的主意。

请记住,为此需要额外的存储空间,但如果您检查人们对数据库询问的大量问题,“我该如何快速执行此操作?”远远超过“我如何使用更少的磁盘空间?”。

而删除触发器将简单地删除DescLookup表中的所有条目以及相关的MovieId

因为Word列索引(还有如你的要求,你会不会搜索每一个描述字段),它的搜索将是快如闪电。这是因为:

select MovieId from DescLookup where Word = 'nature'; 

会吹:

select Id from Movies where lower(Description) like '%nature%'; 

出来的水。

+0

这是一个非常酷的方法,但我猜OP已经有他的表填充。你能否建议一种方法让他从他现在的东西中产生起始数据集? – Drew 2010-05-25 04:59:29

+0

是的,创建辅助表,设置插入/更新触发器,然后执行:'更新电影设置desc = desc;'。这应该激发数据库中每一行的触发器。如果你的数据库管理系统是如此聪明(或者鬼鬼祟祟的,IMNSHO),以至于不能认识到这是一个真正的更新,只需要:'更新电影集desc =''|| desc;更新电影集desc = substr(desc,2);'或类似的东西。 – paxdiablo 2010-05-25 05:03:26

2

在这种情况下,您希望使用全文搜索索引。要知道,有一些渔获不过,如最小的字,长度,停止字等

对FTS的语法如下:

WHERE MATCH (field) AGAINST ('text');