如何为可自定义的应用程序设置数据模型

时间:2011-09-02 15:15:36

标签: asp.net sql-server data-modeling

我有一个由多个客户端使用的ASP.NET数据输入应用程序。该应用程序由多个数据输入模块组成,这些模块对所有客户端都是通用的。

我现在有多个客户端想要添加自己的自定义模块,这些模块通常包含十几个数据点。一些值将是文本,其他值是数字,一些将是下拉选择等。

我需要为此处理数据模型的建议。我有两个关于如何处理的想法。首先是为每个客户端的每个新模块创建一个新表。这很干净,但我不是特别喜欢它。我的另一个想法是为每个客户端的每个自定义数据点创建一个包含列的表。这个表最终会有很多列和很多NULL值。我真的不喜欢任何一种解决方案,并怀疑有更好的方法可以做到这一点,所以任何反馈你都会受到赞赏。

我正在使用SQL Server 2008。

2 个答案:

答案 0 :(得分:2)

与这些问题一样,“这取决于”。

可怕的键值表。

此方法依赖于一个表格,该表格将字段及其值列为单个记录。

CustomFields(clientId int, fieldName sysname, fieldValue varbinary)

优点:

  • 无限灵活
  • 易于实施
  • 易于索引
  • 不存在的值不占用空间

缺点:

  • 显示包含完整字段列表的所有记录的列表是一个非常脏的查询

Microsoft方式

这种问题的Microsoft方式是“稀疏列”(在SQL 2008中引入)

好处:

  • 由设计SQL Server的人祝福
  • 可以查询记录而无需应用花式枢轴
  • 没有数据的字段不占用磁盘空间

缺点:

xml税

您可以向表中添加一个xml字段,该字段将用于存储所有“额外”字段。

优点:

  • 无限灵活性
  • 可以编入索引
  • 存储效率高(当它适合页面时)
  • 通过一些xpath体操,这些字段可以包含在平面记录集中。
  • 可以使用架构集强制执行
  • 架构

缺点:

  • 无法清楚地看到该领域的内容
  • SQL Server中的xquery支持有一些空白,有时会使您的数据成为真正的噩梦

可能有更多的解决方案,但对我来说,这些是主要的竞争者。选择哪一个:

    当额外字段的数量有限时,
  • 键值似乎是合适的。 (说不超过10-20左右)
  • 稀疏列更适合具有许多属性的数据,这些属性很少填写。当你有更多额外的字段时听起来更合适
  • xml列非常灵活,但查询很痛苦。适用于很少编写且很少查询的解决方案。即:不要对存储在该字段中的数据运行聚合等。

答案 1 :(得分:0)

我建议你选择你描述的第一个选项。我不会想到它。在我看来,你概述的第二个选项是个坏主意。

如果您要添加到系统的所有模块都有共同的字段,则应考虑将这些字段保存在单个表中,然后让其他表格将特定于特定模块的字段与公共表中的主键相关联。这基本上是表继承(h ttp://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server),它将集中化公共模块数据,并使跨模块查询更容易。