我有一个由多个客户端使用的ASP.NET数据输入应用程序。该应用程序由多个数据输入模块组成,这些模块对所有客户端都是通用的。
我现在有多个客户端想要添加自己的自定义模块,这些模块通常包含十几个数据点。一些值将是文本,其他值是数字,一些将是下拉选择等。
我需要为此处理数据模型的建议。我有两个关于如何处理的想法。首先是为每个客户端的每个新模块创建一个新表。这很干净,但我不是特别喜欢它。我的另一个想法是为每个客户端的每个自定义数据点创建一个包含列的表。这个表最终会有很多列和很多NULL值。我真的不喜欢任何一种解决方案,并怀疑有更好的方法可以做到这一点,所以任何反馈你都会受到赞赏。
我正在使用SQL Server 2008。
答案 0 :(得分:2)
与这些问题一样,“这取决于”。
可怕的键值表。
此方法依赖于一个表格,该表格将字段及其值列为单个记录。
CustomFields(clientId int, fieldName sysname, fieldValue varbinary)
优点:
缺点:
Microsoft方式
这种问题的Microsoft方式是“稀疏列”(在SQL 2008中引入)
好处:
缺点:
xml税
您可以向表中添加一个xml字段,该字段将用于存储所有“额外”字段。
优点:
缺点:
可能有更多的解决方案,但对我来说,这些是主要的竞争者。选择哪一个:
答案 1 :(得分:0)
我建议你选择你描述的第一个选项。我不会想到它。在我看来,你概述的第二个选项是个坏主意。
如果您要添加到系统的所有模块都有共同的字段,则应考虑将这些字段保存在单个表中,然后让其他表格将特定于特定模块的字段与公共表中的主键相关联。这基本上是表继承(h ttp://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server),它将集中化公共模块数据,并使跨模块查询更容易。