我有一个包含大量列 (~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 制作另一个表格在第一张 table 上。我知道理论上如何做到这一点,但这将是一项巨大的工作量。此外,我们可能会丢失有关每个数据来自哪一列的信息,这不是很好。此外,这感觉就像解决方案 1 是多余的,但我实际上并不知道表索引是如何创建的。
到目前为止,这些是我们提出的解决方案。如果相关,我们正在使用 Oracle 数据库,这并不是真正可选的,但我有权以任何必要的方式重构数据库。那么,这里最好的解决方案是什么?当然,“以上都不是”是一个完全可以接受的答案。这些表格实际上都不存在,因此没有什么可以清除和重新制作的。
谢谢!
最佳答案
您提到的示例确实更适合全文搜索(正如 Bill Karwin 所建议的)。在没有看到(草稿)表定义的情况下,很难看出情况是否确实如此。
好消息是 10K 条记录对于经过良好调整的 Oracle 服务器来说是微不足道的数量。如果那是您的表将增长的最大数量,我会避免任何有利于可维护性的奇异解决方案。
EAV 基本上使 bool 运算符成为一个巨大的痛苦,并使支持特定数据类型(文本、日期、数字等)成为同样巨大的痛苦。
我会根据您对索引方案的最佳猜测构建您的表格样本,用具有代表性的虚拟数据填充它,并根据您期望的数据行运行查询。测量性能,看看是否有问题;优化您的索引和查询,只有在确实需要时才进行重构。
关于database - 如何构建表以快速搜索大量列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7516659/