在sql中查询数据字典的最佳方法
本文关键字:最佳 方法 数据字典 查询 sql | 更新日期: 2023-09-27 18:08:09
对于我正在设置的项目,我需要一个非常动态的数据结构。我将存储没有定义的记录。一条记录可能包含5列,另一条可能包含10列。
为了支持这一点,我想使用包含以下列的表:
ResultIdRecordIdRecordTypeId关键值
这支持所有可能的方案,但我有几个问题。
- 这是最好的方法还是我错过了更好的选择?
- 有什么好方法来查询这个并获得我的记录,他们进入的方式?我有存储在不同表中的定义,它告诉我每个记录类型存储哪些列。我已经看到需要动态构建的PIVOT语句,因为您需要以数组样式提供字段(尽管我猜可以通过存储过程提供)
- 对于大量记录,性能如何维持?
- 使用EF/Linq之类的东西是否方便?
这将在。net 4, c#中使用SQL2008R2 Express后端进行编码。我正在寻找一些最佳实践。
更新!更明确一点:我需要存储来自不同的未知查询的数据结果集。我不知道会有多少查询定义,也不知道它们会是什么样子。此数据库中的数据仅用于处理。用户甚至不会知道这些表格的存在,不会有任何输入,不会有任何报告或任何数据以任何方式出现在屏幕上。结果集用于与其他结果集进行比较,所有这些都通过代码进行。我需要的是一种高度动态的方式来存储这些记录,当涉及到大量记录时,它能保持运行。
我想到的另一个选项是:
ResultIdRecordIdfield1 (sql_variant)field2 (sql_variant)field3 (sql_variant)field4 (sql_variant)…
这是个好主意吗?
我知道这并没有回答这个问题,但是我忍不住要发帖(尽管我很可能会被否决)。它说明了这一点。直接从每日WTF:
这是我的第二次面试,它开始相当交谈。
"我们正在考虑在数据库中存储表名和列,"采访中说,"这是一个四处流传的想法。"
我回答说,"而不是创建表和存储数据取决于它的结构是怎样的?"
"是啊!"他的眼睛亮了起来,"那么我们就不需要定义结构了。任何其他的混乱!"我怀疑这是某种测试。"你怎么写报告?"那会不会很尴尬?"
"我们可以从前端开始。"
"也许吧,"我说,"但这不是需要很多代码吗?"它会是令人难以置信的慢。"
"如果我们使用哈希表就不会!"
"好吧……那么数据完整性,外键之类的呢?"
他变得更有戒心了,"一切都是从前端开始的。"
"我想,但这将需要大量的代码各种复杂的SQL查询。换一个也没那么糟数据库- "
"不,"他打断了他的话,"我们会用一个数据访问层来抽象它规范化的数据结构。""你的意思是……喜欢表吗?"
两天后,我的招聘人员告诉我,他们拒绝了我的申请因为我的技术水平不够虽然我想知道我很高兴他们实现了元数据库的实现我永远不会知道。
http://thedailywtf.com/Articles/Three-for-Three,-Recursion-Threads,-and-Wrong-Answer.aspx
查看表的syscolumns和相关的。这看起来很像你所描述的。但是经过多年的努力,Sybase和微软已经提出了一种可能比你能想到的更有效的方法。
要对报表中的每一组不同的列使用此功能,请创建一个新表并导入数据——数据库将为您管理访问。如果你有这些数据,那么在这些SQL表上创建索引就很容易了。
我不知道你所有的需求,但如果你只是有额外的动态字段,你可能想看看SQL Server中的XML数据类型:在SQL Server中实现XML。这将允许您针对XML数据类型编写SQL查询。
顺便说一下,你的建议并不完全是疯狂的想法。有许多知名的文档管理系统都使用了非常相似的动态模式实现。要查询数据,需要构造一个相当复杂的查询。在您的示例中,您只需按记录id对记录进行分组,并提供所有记录列。在您继续实现这些之前,请仔细考虑是否有可能使用静态模式实现这些。这将使您的工作更轻松(在实现时,尤其是在调试应用程序时)。不妨看看类表继承或具体表继承(这些都是静态模式,您可以在设计时使用"继承"进行扩展)。