database - 如何构建表以快速搜索大量列

标签 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 制作另一个表格在第一张 table 上。我知道理论上如何做到这一点,但这将是一项巨大的工作量。此外,我们可能会丢失有关每个数据来自哪一列的信息,这不是很好。此外,这感觉就像解决方案 1 是多余的,但我实际上并不知道表索引是如何创建的。

到目前为止,这些是我们提出的解决方案。如果相关,我们正在使用 Oracle 数据库,这并不是真正可选的,但我有权以任何必要的方式重构数据库。那么,这里最好的解决方案是什么?当然,“以上都不是”是一个完全可以接受的答案。这些表格实际上都不存在,因此没有什么可以清除和重新制作的。

谢谢!

最佳答案

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

好消息是 10K 条记录对于经过良好调整的 Oracle 服务器来说是微不足道的数量。如果那是您的表将增长的最大数量,我会避免任何有利于可维护性的奇异解决方案。

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

我会根据您对索引方案的最佳猜测构建您的表格样本,用具有代表性的虚拟数据填充它,并根据您期望的数据行运行查询。测量性能,看看是否有问题;优化您的索引和查询,只有在确实需要时才进行重构。

关于database - 如何构建表以快速搜索大量列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7516659/

相关文章:

database - ms Access 查询挂起

oracle - 如何检查表中是否有带有主键值的记录?

java - JDBC QueryTimeout 仅适用于某些供应商

java - 如何在使用基本身份验证的 JDeveloper 中测试 Web 服务?

design-patterns - 通用模型是反模式吗?

database - 将多个在线销售点数据保存到单个销售点的最佳方法

sql - 如何在 Oracle PLSQL 中透视表?

database - 什么是提供商和驱动程序?

sql - 重构字段的外键

MYSQL数据库结构与设计