如何构建表以便在大量列上进行快速搜索

时间:2011-09-22 14:40:05

标签: database oracle database-design relational-database entity-attribute-value

我有一个包含大量列(~60)的表,最终会有大量行(~10 000),并且我需要能够有效地搜索多个列值立刻。我不确定搜索是否完全匹配(LIKE 'value',而不是LIKE '%value%'),尽管LIKE 'value%'可能是可接受的妥协。

已经提出了一些解决方案。我对数据库设计原则不是很熟悉,所以对我来说这不是最好的:

  1. 单独索引每列。用户将能够搜索任何列的组合,因此没有更复杂的索引可以工作。在数据库上会有比读写更多的读取,因此写入速度减慢应该不是问题。

  2. 制作另一张表,只是为了搜索,如下所示:

    obj_id  col_num  col_name  col_value
    -------------------------------------    
    1       1        'name'    'joe'    
    1       2        'job'     'engineer'    
    2       1        'name'    'bill'
    

    等。我认为col_num和col_name列是多余的,但是 大概一个比另一个好。我不知道这是什么 虽然它听起来像是Entity-Attribute-Value model(另见this question)。据我所知, 与EAV模型的主要区别在于此表不会 疏;所有实体都拥有大部分或全部属性。

  3. 在第一个表格上为inverted index创建另一个表格。我知道如何在理论上做到这一点,但这将是一项巨大的工作。此外,我们可能会丢失有关每个数据来自哪个列的信息,这不是很好。另外,这对于解决方案1而言似乎是多余的,但我实际上并不知道如何创建表索引。

  4. 这些是我们迄今为止提出的解决方案。如果它是相关的,我们使用的是Oracle数据库,它实际上不是可选的,但我有权以任何必要的方式重构数据库。那么,这里最好的解决方案是什么?当然,“以上都不是”完全可以接受的答案。这些表中没有一个实际存在,所以没有什么可以消除和重制。

    谢谢!

2 个答案:

答案 0 :(得分:3)

如何使用Oracle的全文搜索功能?您的需求似乎符合 CTXCAT 的目的。

有关Oracle中不同全文索引选项的概述,请参阅Indexing with Oracle Text

答案 1 :(得分:3)

您提到的示例确实更适合全文搜索(正如Bill Karwin建议的那样)。在没有看到(草稿)表定义的情况下,很难看出实际情况是否如此。

好消息是10K记录对于经过良好调整的Oracle服务器来说是微不足道的。如果这是您的桌子增长最大的,我会避免任何奇特的解决方案,以支持可维护性。

EAV基本上使布尔运算符成为背后的巨大痛苦,并使支持特定数据类型(文本,日期,数字等)成为同样巨大的痛苦。

我会在索引方案中使用您最好的猜测来构建表的示例,使用有代表性的虚拟数据填充它,并按照您期望的那些行运行查询。衡量表现,看看你是否有问题;优化你的索引和查询,如果你真的需要,只进行重构。