在asp.net应用程序中添加新列

在asp.net应用程序中添加新列,asp.net,database,Asp.net,Database,我在一个新的小项目中面临这个问题: 将要构建的系统将允许用户向系统中的表添加新列,然后用户将能够维护数据,我认为有两种方法可以实现这一点: 1) 创建一些表,包括带有“columnName”“columnValue”“datatype”等的“columns”表来存储列定义,另一个表“XXCoumn”来存储列的值(由用户输入),以及使用存储过程来查询/更新列数据。 2) 当用户输入一个新列时,在表模式中创建该列,那么表数据的维护就和正常情况一样了 你们怎么看?或者有什么新的建议 一些附加信息:数据

我在一个新的小项目中面临这个问题: 将要构建的系统将允许用户向系统中的表添加新列,然后用户将能够维护数据,我认为有两种方法可以实现这一点: 1) 创建一些表,包括带有“columnName”“columnValue”“datatype”等的“columns”表来存储列定义,另一个表“XXCoumn”来存储列的值(由用户输入),以及使用存储过程来查询/更新列数据。 2) 当用户输入一个新列时,在表模式中创建该列,那么表数据的维护就和正常情况一样了

你们怎么看?或者有什么新的建议


一些附加信息:数据量很小,我需要创建报告。

如果这是由您集中托管的,我建议不允许用户输入数据更改数据库的架构(即驱动新表的创建)


相反,您可能希望研究在SQL中使用XML字段来存储数据的变量字段名,或者更通用的表结构。。。如果我们不是在谈论大量的数据,那么这种技术非常有效。

如果这是由您集中托管的,我建议不允许用户输入数据更改数据库的模式(即,驱动新表的创建)


相反,您可能希望研究在SQL中使用XML字段来存储数据的变量字段名,或者更通用的表结构。。。如果我们不是在谈论大量的数据,那么这种技术非常有效…

您是否可能从侧面看待您的解决方案?听起来你需要一个映射表(有点像你的#1)。你有一个表,比如说“objects”,一个名为“properties”的表,它保存你所调用的列,然后是一个保存值的表,所以它只有object\u id,property\u id,value


用比我说的更聪明的方式,看一下模型。

您是否可能从侧面看您的解决方案?听起来你需要一个映射表(有点像你的#1)。你有一个表,比如说“objects”,一个名为“properties”的表,它保存你所调用的列,然后是一个保存值的表,所以它只有object\u id,property\u id,value

用比我说的更聪明的方式,看一下模型

“要生成的系统将允许用户向系统中的表添加新列…”

真的吗?这就是用户故事?对我来说,听起来你已经决定解决这个问题了

允许用户扩展模式是否是一个好主意取决于上下文。我会有一个像管理员一样的小问题,有限的使用方式。但这是一个可怕的坏主意在MySpace类型的方式。我怀疑你的处境介于这两个极端之间

扩展模式将导致更高效的查询—您可以添加索引等—但它确实会向用户公开一些关系规则。此外,扩展可能会锁定整个表,需要处理并发编辑

“要生成的系统将允许用户向系统中的表添加新列…”

真的吗?这就是用户故事?对我来说,听起来你已经决定解决这个问题了

允许用户扩展模式是否是一个好主意取决于上下文。我会有一个像管理员一样的小问题,有限的使用方式。但这是一个可怕的坏主意在MySpace类型的方式。我怀疑你的处境介于这两个极端之间


扩展模式将导致更高效的查询—您可以添加索引等—但它确实会向用户公开一些关系规则。此外,扩展可能会(可能)锁定整个表,需要处理并发编辑。

任何好的建议都需要更好地理解您的需求,但下面是对您提到的选项的一些评论,以及一些其他想法

1) 实体属性值(EAV)设计:这是您描述的选项,其中有一个表,其中包含列名称、类型和值。这个选项的优点是能够轻松容纳无限的新列,但我发现当需要检索有意义的数据时,这是一件痛苦的事情。例如,假设您在这个EAV表中有{Color,varchar}{Red,Green,Blue}和{Size,varchar}{Small,Medium,Large}的行。如果要查找所有小的绿色项,则需要以下内容(当然是未测试的SQL):

将其与“项目”表中实际列的颜色和大小进行对比:

SELECT *
FROM ITEMS
WHERE COLOR = 'Green' AND SIZE = 'Small'
此外,如果数据完整性对本应用程序很重要,那么维护数据完整性将非常困难(而且几乎总是很重要,即使你被告知不这样做)。在上面的示例中,如果“颜色”应限制为蓝色、绿色和红色,则需要实现额外的逻辑。此外,如果某些颜色只有特定的大小,则需要实现更多的逻辑(例如,蓝色项目仅适用于中小型)

2) 用户定义的列:只要让用户能够向表中添加额外的列,就可以简化数据检索,但所有数据完整性问题仍然存在。此外,您的应用程序通常需要额外的逻辑来处理未知列

3) 预先存在的自定义列:我使用过一些应用程序,比如CRM,这些应用程序提供了十几个或更多的用于用户定义的列。基本上,设计师会在“Text1”、“Text2”、“Text3”、“Number1”、“Number2”等栏中添加内容。然后,用户会为这些栏提供标题和描述信息,而这正是应用程序用于显示的目的。该模型的优点是易于检索数据,并且具有预定义的数据库模式,可以
SELECT *
FROM ITEMS
WHERE COLOR = 'Green' AND SIZE = 'Small'