我有一个包含大量列(~60)的表,最终会有大量行(~10 000),并且我需要能够有效地搜索多个列值立刻。我不确定搜索是否完全匹配(LIKE 'value'
,而不是LIKE '%value%'
),尽管LIKE 'value%'
可能是可接受的妥协。
已经提出了一些解决方案。我对数据库设计原则不是很熟悉,所以对我来说这不是最好的:
单独索引每列。用户将能够搜索任何列的组合,因此没有更复杂的索引可以工作。在数据库上会有比读写更多的读取,因此写入速度减慢应该不是问题。
制作另一张表,只是为了搜索,如下所示:
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模型的主要区别在于此表不会 疏;所有实体都拥有大部分或全部属性。
在第一个表格上为inverted index创建另一个表格。我知道如何在理论上做到这一点,但这将是一项巨大的工作。此外,我们可能会丢失有关每个数据来自哪个列的信息,这不是很好。另外,这对于解决方案1而言似乎是多余的,但我实际上并不知道如何创建表索引。
这些是我们迄今为止提出的解决方案。如果它是相关的,我们使用的是Oracle数据库,它实际上不是可选的,但我有权以任何必要的方式重构数据库。那么,这里最好的解决方案是什么?当然,“以上都不是”完全可以接受的答案。这些表中没有一个实际存在,所以没有什么可以消除和重制。
谢谢!
答案 0 :(得分:3)
如何使用Oracle的全文搜索功能?您的需求似乎符合 CTXCAT 的目的。
有关Oracle中不同全文索引选项的概述,请参阅Indexing with Oracle Text。
答案 1 :(得分:3)
您提到的示例确实更适合全文搜索(正如Bill Karwin建议的那样)。在没有看到(草稿)表定义的情况下,很难看出实际情况是否如此。
好消息是10K记录对于经过良好调整的Oracle服务器来说是微不足道的。如果这是您的桌子增长最大的,我会避免任何奇特的解决方案,以支持可维护性。
EAV基本上使布尔运算符成为背后的巨大痛苦,并使支持特定数据类型(文本,日期,数字等)成为同样巨大的痛苦。
我会在索引方案中使用您最好的猜测来构建表的示例,使用有代表性的虚拟数据填充它,并按照您期望的那些行运行查询。衡量表现,看看你是否有问题;优化你的索引和查询,如果你真的需要,只进行重构。