我们正在开发一个带有SQL Server后端的.NET应用程序。客户端请求在部署应用程序之后动态地将自定义属性添加到实体的能力。允许最终用户动态添加列到表
如建议in a similar question我们可以创建一个表格,然后为每个自定义属性值(Entity-attribute-value模型)包含一行。但是,我们正在考虑允许最终用户实际修改表格(相同问题中的also suggested),即添加和删除列。
(编辑:如在评论中指出,DDL不会直接由用户或应用程序执行,而是通过存储过程,确保一切顺利)
主要理由是:
- 改进的性能/可搜索属性
- 这些属性几乎总是需要显示为列,例如在用户界面的数据网格中或在Excel/PowerPivot中提取数据以供进一步处理时。
- 数据是强类型(而不是存储所有属性值为varchar)
- 简化数据模型
是否存在,我们应该知道什么注意事项?
东西,脑海中出现:
- 备份/恢复,可能是无法处理不断变化的数据结构
- 依赖对象(如视图)未正确更新,以反映业务这些更改(依赖视图必须执行
select * from table
以包含任何添加的列)。 - ...
任何有关此方法输入是极大的赞赏。
这可能是一种情况,其中属性为非规范化的[实体属性值](http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)模型作为行存储实际上是最有意义的。 – mellamokb
是的,请不要让用户将猴子扳手扔进你的数据库。至少通过EAV,你可以控制他们正在肆意破坏的东西...... http://sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/what-is-so-bad-about-eav -anyar.aspx –
@AaronBertrand,感谢您的链接,这里有一些很好的观点。但是,他提到了导致我们探索非EAV方法的相同缺点。我们不允许用户直接执行DDL。一些存储过程可以作为猴子扳手驱蚊剂,确保添加/删除操作顺利进行。此外,只有合格的用户才有权执行这些操作。 – bernhof