允许用户即时向其数据库添加列的最佳方法是什么?

Den*_*ail 3 c# database sql-server sql-server-2008

我们正在设计一个管理联系信息的应用程序.

客户的一个要求是允许其powerusers或admin-type staff通过UI向数据库添加列.客户无法直接访问数据库(即,他们无法使用SSMS打开并进行更改).

我看到控件1)输入字段名称,2)输入数据类型,3)选择要添加字段的表.用户单击按钮后,将使用新字段更新数据库.我需要检查适当的权限,该字段是否已经存在等等.我们还需要将表单字段连接到这个新字段,就像报表设计器界面一样.

  1. 我在哪里可以找到显示我想要做的样本?
  2. 这样做有什么缺点?除了开发人员做这件事似乎相当多的工作之外.
  3. 你会建议这样做吗?如果没有,什么是更好的解决方案?

编辑 - 我们需要使用SQL Server.不可协商.

Ada*_*son 12

是绝对要求他们向表中添加列,还是只能指定要存储的其他字段?我强烈建议你考虑像Entity-Attribute-Value这样的东西,而不是允许最终用户(管理员算作最终用户)进行架构更改.

对于类似这样的事情,您将有一个表来定义自定义字段,然后是一个多对多关联表,以允许用户为联系人指定自定义字段的值.例如:

    Contact
    ---------
 -> ContactId
|   FirstName
|   LastName
|   etc.
|
|                        ContactField
|                        --------------
|                        ContactFieldId <---
|                        FieldName          |
|                                           |
|   ContactFieldValue                       |
|   -------------------                     |
 -- ContactId                               |
    ContactFieldId -------------------------
    Value
Run Code Online (Sandbox Code Playgroud)

实现的具体细节显然取决于你(例如,是否ContactId + ContactFieldId用作复合主键ContactFieldValue),但这应该得到一般性的想法.

  • +1:非常*非常*很少是允许用户创建新列的最佳解决方案. (2认同)

HLG*_*GEM 5

我会大力推销该要求,并让他们知道这是一个非常糟糕的主意。是的,您可以为这些表添加一个EAV表,但是这样就存在查询该表既简单又不高效的问题。或者,您可以按照@Jerry Coffin的建议使用带有六打备用列的表,但是他的使用会导致报告困难,以及使用它们时会发生什么情况。所有这些都导致开发人员需要进行大量额外工作来支持一项可能不会导致每年3次数据库更改的要求。您正冒着数据完整性,数据库性能和报告准确性的风险(我敢打赌这些新字段将不具有PK / FK关系或默认值,甚至不会是正确的数据类型,因此日期是varchars,因此数据将被添加到截止日期为ASAP的数据库将不会

我曾经使用过许多允许这种情况的COTS产品,但是当人们实际添加列时,结果却始终不尽人意(很少有人实际上很勇敢地做到这一点)。他们不会按照需要使用它们的表单,它们不会自动添加到报表中,它们通常也无法搜索,并且在每种情况下,他们最终花费更多的钱来找人来解决他们制造的数据混乱,聘请专业人员来进行设计更改会产生成本。

在大多数时候,我看到这样的要求是因为高级经理认为灵活性很酷,而不是用户真正需要甚至不想这样做的任何能力。他们需要知道所要求的成本。

花更多的时间和更多的时间与高级用户讨论他们的需求并正确地开始设计,这比沿着这条路做要好得多。

这是真正需要长期认真讨论的要求之一,这些要求不仅要花费开发时间,而且要花费几乎没有收益的数据完整性,性能和可维护性。我将进行正式的成本效益分析,以向他们确切说明这个想法有多糟糕。然后,一旦他们完全了解他们所要求的完全愚蠢,如果他们仍然想要它,那就继续构建它并开始寻找新工作,因为您不想成为必须维护的人这个。