【问题标题】:Query engine for a variable data source. C#可变数据源的查询引擎。 C#
【发布时间】:2026-02-03 07:25:01
【问题描述】:

我有越来越多的 Excel 电子表格,其中没有一个具有相同的数据结构。我需要一种机制来使用单个界面查询这些电子表格(DataTables)中的每一个。因此,基本上,您从下拉列表中选择 DataTable,然后执行搜索。

我最初的想法是这样处理。

  • 在 SQL 中创建通用数据结构。这将由四个表组成。 1) Study 2) StudyProperty 3) StudyPropertyType(数据类型的静态列表)和 4) StudyData。
  • 第一步是定义一项研究。这意味着您在研究表中创建一个条目,为其命名和描述。此外,您将为 Excel 电子表格中的每个对应字段创建一个 StudyProperty 记录,并选择适当的 StudyPropertyType。
  • 因此,如果您有一个包含两列(姓名和出生日期)的电子表格,您将获得一个 Study 记录和两个 StudyProperty 记录(Name with the StudyPropertyType = string)和(Date of Birth with the StudyPropertyType = DateTime )
  • 定义研究后,我可以将 Excel 电子表格中的数据导入 StudyData 表。
  • StudyData 表对于每个可能的数据类型都有一个 Id 和一个列。根据研究定义,导入的数据会根据数据类型存储在研究表的相应字段中。因此,出生日期将存储在研究表的 ValueDateTime 字段中。

综上所述,我可以将所有电子表格存储在 SQL 中,但现在我对如何构建通用查询机制感到困惑。

我觉得这比需要的复杂得多,我希望有更好的方法来处理未知数据结构。

【问题讨论】:

    标签: c# sql-server excel data-structures


    【解决方案1】:

    SQL(和一般的 RDBMS)根本不能很好地处理未知的数据结构。通常,它们违反了关系数据库的所有传统定义。

    您所说的具有灵活属性的非常诱人的架构称为 EAV(实体属性值)或数据库中的数据库,并且可以在 SQL/数据库中成功使用(如果使用得非常小心) ) 但大多数情况下只是灾难的根源。 * 上有很多关于 EAV 的问题。

    我成功使用它的情况不是用于临时查询,而是用于我想在实体上进行任意设置并且它们不存在将回退到默认值的设置(并且可能是默认默认值) - 你看,这就是 EAV 危险的原因!)然而,通常情况下,应用程序(或存储过程)中有额外的代码知道设置,但数据库不知道。仅这句话就可以让您了解为什么这不是一个好的(数据库)实践。当我使用它时,有一个压倒一切的架构问题。使用它会阻止数据库管理其数据(特别是数据类型的弱点)并确保完整性/边界合同,因为它对它知之甚少。所以通常情况下,我将它与 SP/视图/UDF 配对,以尽可能多地为数据库提供控制。

    EAV 有一个近亲,它与数据仓库和统计性能有关。在这些情况下,通常有几个维度——业务单位、时间、地理区域、总帐部门等,然后是计量代码和计量值(通常是 MONEY)。因此,对于 2001 年 1 月 1 日的特定业务单位等,您可能有一个费用计量,其中代码 1 代表费用,代码 2 代表收入等。这与 EAV 存在许多相同的缺点,其理由是您可以通过添加行而不是更改架构来添加度量(在可能有数十亿行的表上)。指标也会随着时间的推移而变化,这是一个很好的表示,它可以很好地处理汇总等。

    我会强烈考虑在实施 EAV 之前 - 回到您的需求/用例,看看是否有替代方案 - 甚至分析电子表格(使用 Excel 对象模型)并构建匹配数据库中的表,然后允许对这些单独的表进行临时查询可能会更容易。

    【讨论】:

    • 非常感谢我们的详尽解释。我想我可能会同意您创建数据库表以匹配导入的电子表格的建议。