对于我正在设置的项目,我需要一个非常动态的数据结构。我要存储我没有定义的记录。一条记录可能包含5列,另一条记录可能包含10列。
为了支持这一点,我想使用包含以下列的表:
ResultId 的recordId RecordTypeId 键 值
这支持所有可能的方案,但我做了几个问题。
这将使用SQL2008R2 Express后端在.NET 4,C#中编码。我正在寻找一些最佳实践。
更新!为了澄清一点:我需要存储来自不同的,未知的查询的数据的结果集。我不知道会有多少查询定义或它们会是什么样子。此数据库中的数据仅用于处理。用户甚至不知道这些表存在,没有输入,也不会有任何报告或任何数据以任何方式击中屏幕。结果集用于与其他结果集进行比较,所有这些都通过代码进行。我需要的是一种高度动态的方式来存储这些记录,这些记录会在涉及大量记录时继续执行。
我想到的另一个选择是:
ResultId 的recordId field1(sql_variant) field2(sql_variant) field3(sql_variant) field4(sql_variant) ...
这是一个更好的主意吗?
答案 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 Inheritance或Concrete Table Inheritance(这些是您可以在设计时使用“继承”扩展的静态模式)。