2011-09-02 84 views
4

我有一个由多个客户端使用的ASP.NET数据录入应用程序。该应用程序由多个数据输入模块组成,这些模块对所有客户端都是通用的如何为可定制应用程序设置数据模型

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

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

我使用SQL Server 2008的

回答

2

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

可怕的键值表。

该方法依赖于一个表,其中列出了字段及其值作为单独的记录。

CustomFields(clientId int, fieldName sysname, fieldValue varbinary) 

优点:

  • 无限灵活
  • 容易实现
  • 易于指数
  • 不存在的价值不采取任何空间

缺点:

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

微软的方式

这类问题的微软的方法是“稀疏列”(介绍在SQL 2008)

优点:

  • 由PEO有福

    • Many technical restrictions
    • 一个:PLE谁设计的SQL Server
    • 记录可以不必申请花哨的枢轴
    • 字段没有数据不占用磁盘

    缺点空间查询新领域需要DML

xml税

您可以将xml字段添加到将用于存储所有“额外”字段的表中。

优点:

  • 无限的灵活性
  • 可以被索引
  • 存储高效的(当它在一个页面适合)
  • 对于某些xpath的体操字段可以被包括在一个平坦的记录集。
  • 模式可以与架构集合强制执行

缺点:

  • 不能清楚地看见什么领域
  • 的XQuery在SQL Server的支持有差距,这使得有时让你的数据的真正的噩梦

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

  • 键值似乎是适当的时候额外的字段的数量是有限的。 (比如说不超过10-20左右)
  • 稀疏列更适合具有很多不常出现的属性的数据。听起来更合适,当你可以有很多额外的字段
  • xml列非常灵活,但很难查询。适用于很少写入和查询的解决方案。即:不要对存储在该字段中的数据运行聚合等。
+0

+1组织良好,信息丰富。我添加了一个链接到xml-eav选项。 –

+0

修正了降价。 –

0

我建议你去与你所描述的第一个选项。我不会认为它。在我看来,你列出的第二个选项是一个坏主意。

如果有共同所有要添加到系统中的模块,你应该考虑让那些在一个表中,然后有其他的表格与字段特定于通用相关返回主键的特定模块领域表。这基本上是表继承(h ttp://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server),并将集中公共模块数据并使其更容易跨模块进行查询。

相关问题