我有一个由多个客户端使用的ASP.NET数据输入应用程序.该应用程序由所有客户端共用的多个数据输入模块组成.
我现在有多个客户端想要添加自己的自定义模块,通常包含十几个数据点.一些值将是文本,其他值是数字,一些将是下拉选择等.
我需要为此处理数据模型的建议.我有两个关于如何处理的想法.首先是为每个客户端的每个新模块创建一个新表.这很干净,但我不是特别喜欢它.我的另一个想法是为每个客户端的每个自定义数据点创建一个包含列的表.这个表最终会有很多列和很多NULL值.我真的不喜欢任何一种解决方案,并怀疑有更好的方法来做到这一点,所以任何反馈都会受到赞赏.
我正在使用SQL Server 2008.
最佳答案 与这些问题一样,“这取决于”.
可怕的键值表.
此方法依赖于一个表,该表将字段及其值列为单个记录.
CustomFields(clientId int, fieldName sysname, fieldValue varbinary)
优点:
>无限灵活
>易于实施
>易于索引
>不存在的值不占用空间
坏处:
>显示包含完整字段列表的所有记录的列表是一个非常脏的查询
微软的方式
微软这种问题的方式是“稀疏列”(在SQL 2008中引入)
优点:
>由设计SQL Server的人祝福
>无需应用花式枢轴即可查询记录
>没有数据的字段不占用磁盘空间
坏处:
> Many technical restrictions
>新字段需要DML
xml税
您可以向表中添加一个xml字段,该字段将用于存储所有“额外”字段.
优点:
>无限灵活性
>可以编入索引
>存储效率(当它适合页面时)
>通过一些xpath体操,这些字段可以包含在平面记录集中.
>架构可以使用架构集合强制执行
缺点:
>没有清楚地看到该领域的内容
> SQL Server中的xquery支持存在差距,这有时会使您的数据成为真正的噩梦
可能有更多的解决方案,但对我来说这些是主要的竞争者.选择哪一个:
>当额外字段的数量有限时,键值似乎是合适的. (说不超过10-20左右)
>稀疏列更适合具有许多属性的数据,这些属性很少填写.当你可以拥有许多额外的字段时,听起来更合适
> xml列非常灵活,但查询起来很痛苦.适用于很少编写且很少查询的解决方案.即:不要对存储在该字段中的数据运行聚合等.