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

时间:2009-02-27 00:25:21

标签: asp.net database

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

你认为哪个方式?或任何新的建议?

一些额外的信息:数据量很小,我需要创建报告。

4 个答案:

答案 0 :(得分:2)

任何好的建议都需要更好地了解您的要求,但这里有一些关于您提到的选项的评论,以及一些其他想法。

1)实体 - 属性 - 值(EAV)设计:这是您描述的具有包含ColumnName,Type和Value列的表的选项。这个选项的优点是能够轻松容纳无限的新列,但是我发现在找回有意义的数据时会很痛苦。例如,假设您在此EAV表中有{Color,varchar} {Red,Green,Blue}和{Size,varchar} {Small,Medium,Large}的行。如果你想找到所有的小绿色项目,你需要这样的东西(当然是未经测试的SQL):

SELECT * 
FROM ITEMS 
WHERE ITEMID IN (SELECT ITEMID 
                 FROM ITEM_ATTRIBUTES ATT INNER JOIN ITEM_VALUES VLS
                     ON ATT.AttributeID = VLS.AttributeID
                 WHERE ATT.ColumnName = 'Color' AND VLS.Value = 'Green')
  AND ITEMID IN (SELECT ITEMID 
                 FROM ITEM_ATTRIBUTES ATT INNER JOIN ITEM_VALUES VLS
                     ON ATT.AttributeID = VLS.AttributeID
                 WHERE ATT.ColumnName = 'Size' AND VLS.Value = 'Small')

将此与对象颜色和大小的实际列进行对比:

SELECT *
FROM ITEMS
WHERE COLOR = 'Green' AND SIZE = 'Small'

此外,如果这对于这个应用程序很重要,那么你将很难保持数据的完整性(即使你被告知,这几乎总是很重要)。在上面的示例中,如果“Color”应限制为Blue,Green和Red,则需要实现额外的逻辑。此外,如果某些颜色只有特定尺寸,则需要实现更多逻辑(例如 - 蓝色项目仅适用于中小型)

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

3)预先存在的自定义列:我使用了一些应用程序,例如CRM,它们提供了十几个或更多列用于用户定义。基本上,设计人员会输入“Text1”,“Text2”,“Text3”,“Number1”,“Number2”等列。然后,用户会为这些列提供标题和描述信息,这就是应用程序使用的显示目的。该模型具有易于数据检索的优点,以及预定义的DB模式,可简化应用程序逻辑。但是,数据完整性问题仍然存在另一个明显的缺点是你将用完预定义的列,这是你通常试图避免使用这种类型的解决方案。

与大多数设计问题一样,每个解决方案都存在权衡。我的经验是,虽然许多用户/客户说他们想要这样的解决方案,但实际上他们只是试图确保他们不会被一个无法满足他们需求的应用所困。我发现实际上很少需要这样的设计。我几乎总能创建一个设计来满足客户的扩展需求,而不会让他们担任数据库设计师的角色。

答案 1 :(得分:1)

  

“要构建的系统将允许用户将新列添加到系统中的表...”

真的 - 那是用户故事吗?对你而言,听起来你已经决定了解决方案。

允许用户扩展模式是否一个好主意是非常依赖于上下文的。我在管理员,有限的使用方式方面没有什么问题。但在MySpace类型的方式中,这是一个非常糟糕的主意。我怀疑你的情况介于两个极端之间。

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

答案 2 :(得分:0)

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

相反,您可能希望在SQL中使用XML字段来存储数据的变量字段名称,或更通用的表结构...如果我们不是在谈论疯狂的数据量,这种技术非常有用......

答案 3 :(得分:0)

你有可能侧身看待你的解决方案吗?听起来你需要一张映射表(有点像你的#1)。你有一个表,例如“对象”,一个名为“properties”的表,它包含你正在调用的列,然后是一个包含值的表,所以它只有object_id,property_id,value。

要采用比我说的更聪明的方式,请查看Entity-attribute-value模型。