在sql中查询数据字典的最佳方法

时间:2011-09-07 20:53:56

标签: c# sql sql-server sql-server-2008

对于我正在设置的项目,我需要一个非常动态的数据结构。我要存储我没有定义的记录。一条记录可能包含5列,另一条记录可能包含10列。

为了支持这一点,我想使用包含以下列的表:

ResultId 的recordId RecordTypeId 键 值

这支持所有可能的方案,但我做了几个问题。

  • 这是最好的方法还是我错过了更好的选择?
  • 查询这个并以我们的方式获取记录的好方法是什么?我将定义存储在一个不同的表中,告诉我每个记录类型存储哪些列。我已经看过需要动态构建的PIVOT语句,因为你需要以数组样式提供字段(虽然这可以通过存储过程提供,我猜)
  • 如何保持大量记录的性能?
  • 使用像EF / Linq这样的东西是否方便?

这将使用SQL2008R2 Express后端在.NET 4,C#中编​​码。我正在寻找一些最佳实践。

更新!为了澄清一点:我需要存储来自不同的,未知的查询的数据的结果集。我不知道会有多少查询定义或它们会是什么样子。此数据库中的数据仅用于处理。用户甚至不知道这些表存在,没有输入,也不会有任何报告或任何数据以任何方式击中屏幕。结果集用于与其他结果集进行比较,所有这些都通过代码进行。我需要的是一种高度动态的方式来存储这些记录,这些记录会在涉及大量记录时继续执行。

我想到的另一个选择是:

ResultId 的recordId field1(sql_variant) field2(sql_variant) field3(sql_variant) field4(sql_variant) ...

这是一个更好的主意吗?

3 个答案:

答案 0 :(得分:15)

我知道这不回答这个问题,但我不能不发布(虽然我很可能会被投票)。它说明了这一点。直接来自每日WTF:

  

这是我的第二次面试,它开启了非常对话。

     

“我们正在考虑在数据库中存储表名和列,”   采访中说,“这是一个浮动的想法。”

     

我回答说,“而不是依赖于创建表格和存储数据   如何构建?“

     

“是啊!”他的眼睛亮了起来,“然后我们不必定义结构或   任何其他混乱!“

     

我想知道这是某种考验。 “你会怎么做报道?   这不是很尴尬吗?“

     

“我们可以从前端做到这一点。”

     

“也许,”我说,“但它不需要很多代码吗?而且它会是   非常慢。“

     

“如果我们使用哈希表,那就不行了!”

     

“好的......数据完整性,外键,那种东西怎么样?”

     

他越来越防守,“这一切都来自前端。”

     

“我想,但这都需要大量的代码   与各种复杂的SQL查询。改变一个并不坏   数据库,如果你 - “

     

“不,”他打断道,“我们会使用数据访问层来抽象它   规范化的数据结构。“

     

“你的意思是......像桌子一样?”

     

两天后,我的招聘人员告诉我他们拒绝了我   候选人,因为我不够技术。虽然我不知道是否   他们曾经实现过他们的元数据库实现,我很高兴   我永远不会知道。

http://thedailywtf.com/Articles/Three-for-Three,-Recursion-Threads,-and-Wrong-Answer.aspx

答案 1 :(得分:2)

查看表syscolumns及相关表格。这看起来很像你描述的。但是经过多年的努力,Sybase和微软已经提出了一种可能比你想出的更有效的方法。

要在报告中为每组不同的列使用此功能,请创建一个新表来导入数据 - 数据库将为您管理访问权限。您评论这些表上没有任何标记 - 但是您在模式中保存了哪些信息 - 如果您拥有该数据,那么就可以轻松地在这些SQL表上创建索引。

答案 2 :(得分:1)

我不知道您的所有要求,但如果您只是有额外的动态字段,您可能需要查看SQL Server中的XML数据类型:Implementing XML in SQL Server。这将允许您针对XML数据类型编写SQL查询。

顺便说一句,你所暗示的并不是完全疯狂的想法。有许多众所周知的文档管理系统使用非常相似的动态模式实现。要查询数据,您需要构建一个相当复杂的查询。在您的情况下,您只需按记录ID对记录进行分组,并为您提供所有记录列。

在开始实现其中之前,请三思而后行是否有可能使用静态模式实现此功能。这将使您的生活更轻松(在实施时,尤其是在调试应用程序时)。看看Class Table InheritanceConcrete Table Inheritance(这些是您可以在设计时使用“继承”扩展的静态模式)。