查询可变数据源的引擎。 C#

时间:2009-09-29 18:40:13

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

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

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

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

所以说完所有这些,我可以将所有的电子表格存储在SQL中,但现在我对如何构建通用查询机制感到难过。

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

1 个答案:

答案 0 :(得分:1)

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

您正在谈论的具有灵活属性的极其诱人的模式称为EAV(实体 - 属性 - 值)或数据库内的数据库,可以在SQL /数据库中成功使用(如果使用得非常仔细) )但大多数情况下,这只是灾难的一种方法。 StackOverflow上有很多关于EAV的问题。

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

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

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