Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 允许最终用户向表中动态添加列_Sql Server_Dynamic_Ddl_Entity Attribute Value - Fatal编程技术网

Sql server 允许最终用户向表中动态添加列

Sql server 允许最终用户向表中动态添加列,sql-server,dynamic,ddl,entity-attribute-value,Sql Server,Dynamic,Ddl,Entity Attribute Value,我们正在开发一个带有SQL Server后端的.NET应用程序。客户端请求在部署应用程序后能够动态地向实体添加自定义属性 正如建议的那样,我们可以创建一个表,其中包含每个自定义属性值模型的一行。但是,我们正在考虑允许最终用户在同一问题中实际修改表,即添加和删除列 编辑:如注释中所述,DDL不会由用户或应用程序直接执行,而是通过存储过程来确保一切顺利运行 主要原因是: 改进的性能/可搜索属性 属性几乎总是要求以列的形式出现,例如在用户界面的数据网格中,或在Excel/PowerPivot中提取数据

我们正在开发一个带有SQL Server后端的.NET应用程序。客户端请求在部署应用程序后能够动态地向实体添加自定义属性

正如建议的那样,我们可以创建一个表,其中包含每个自定义属性值模型的一行。但是,我们正在考虑允许最终用户在同一问题中实际修改表,即添加和删除列

编辑:如注释中所述,DDL不会由用户或应用程序直接执行,而是通过存储过程来确保一切顺利运行

主要原因是:

改进的性能/可搜索属性 属性几乎总是要求以列的形式出现,例如在用户界面的数据网格中,或在Excel/PowerPivot中提取数据以进行进一步处理时。 数据是强类型的,而不是将所有属性值存储为varchar 简化的数据模型 我们是否有需要注意的事项

我想到的是:

可能无法处理不断变化的数据结构的备份/恢复操作 未正确更新以反映这些更改的从属对象(如视图)从属视图必须执行select*from表才能包含任何添加的列。 ...
非常感谢与此方法相关的任何意见。

我使用的第三方应用程序以多种方式处理此问题:

大多数表都有一个“自定义”版本的表,其中包含各种字段以保存通用命名的数据类型:Number1、Date26、Text3等。。因此,公司和公司客户之间存在着1-1的关系。 列表是在一个表上创建的,该表具有ListID和相应的方式,供用户设置模式和外键以链接到主表。此表有几个通用列,如1

创建自己的表

创建自己的视图和存储过程,并在应用程序中注册它们。这些数据集可以附加到数据网格和/或在自定义报告中使用。 有一个界面,用户可以根据自己的喜好为自己的列添加标签,即Text1=Blah-Blah-Blah-Blah。在这种情况下,会有大量浪费的领域,尽管我的公司已经设法使用了包括Money47在内的大部分领域,但它的性能并不理想,你无法击败我们近乎无限的灵活性

这里的关键是该客户愿意为该功能以及持续支持支付多少费用?如果您允许他们在现有表上创建自定义字段,并且他们决定要更改无法顺利转换的数据类型,他们是否希望您对其进行无序转换和转换


我们可以雇佣一个全职程序员来支付这个系统的费用。SalesForce.com和类似网站具有此功能。我认为你不想为了一个一次性的客户端应用而进入这个领域。从长远来看,他们可能会付钱给你,让你不断更新应用程序。

这可能是一种情况,在这种情况下,将属性存储为行的非规范化模型实际上最有意义。是的,请不要让用户向你的数据库扔扳手。至少有了EAV,你可以控制他们造成的破坏@AaronBertrand,谢谢你的链接,这里有一些好的观点。然而,他提到了导致我们探索非EAV方法的相同缺点。我们不允许用户直接执行DDL。两个存储过程将充当活动扳手排斥剂,确保添加/删除操作平稳运行。此外,只有合格的用户才有权执行这些操作。此外,关于视图的注释,您不能只创建视图来选择*,然后期望事情奇迹般地自行解决。SQL Server缓存元数据,以便在添加列时,视图不会突然开始显示新列,除非您使用sp_refreshview、sp_refreshsqlmodule或重新生成视图。我不认为我需要提及SELECT*带来的所有其他不好的东西……我在这里问了一个问题,不久前。这不是重复或回答您发布的问题,但是您可能会发现其中的一些信息很有用。如果我理解正确,自定义属性Number1、Date26等从第一天起就存在,只是坐在那里等待数据填充?我不太喜欢这种方法,尽管它确实消除了物理修改表的一些直接缺点。我同意,这并不理想。谢谢你的意见。现在我们将避免使用动态方法,而是为每个请求实现新的属性。