我有一个包含 49 列的表,该表已被规范化。这似乎有点过分,但由于每个字段都是表单的一部分并且主要实体是表单,因此我无法重构以将列委托给另一个表的关系,因此我的问题是“是否有任何模式旨在减少表格中的列数?”
我曾尝试做类似问题 - 答案模式的事情,但由于答案值可以是许多不同的数据类型(枚举、字符串、数字),因此没有通用的方法来解析所有内容。
更新:
我没有考虑过,但数据最终将在 JSON 上序列化以从 WEBApi 提供服务,因此拥有大量嵌套字段可能意味着麻烦。
我有一个包含 49 列的表,该表已被规范化。这似乎有点过分,但由于每个字段都是表单的一部分并且主要实体是表单,因此我无法重构以将列委托给另一个表的关系,因此我的问题是“是否有任何模式旨在减少表格中的列数?”
我曾尝试做类似问题 - 答案模式的事情,但由于答案值可以是许多不同的数据类型(枚举、字符串、数字),因此没有通用的方法来解析所有内容。
我没有考虑过,但数据最终将在 JSON 上序列化以从 WEBApi 提供服务,因此拥有大量嵌套字段可能意味着麻烦。
从功能使用方面查看您的表格:
实际实践表明,3-5 个,最多 10 个参数用于搜索和分组依据。这些列有索引,如果正确创建索引(包括外键)——所有操作都会很快。
从功能的角度看结构有帮助吗?即,您能否重新设计该表以符合应用程序使用它的方式?随着时间的推移,带有一堆最初为空列的稀疏填充表可能会导致性能问题。将这些列隔离到它们自己的表中可能是有意义的。
填充后如何使用该表?减少行长度(所有列值使用的字节总和)可以减少执行全表扫描所需的时间。如果要扫描表,那么您将需要隔离不需要的列。
如果任何一种情况都有帮助,包含不需要的列的表将成为另一个表的子表,方法是引用另一个表的主键并在外键上添加唯一约束以确保它保持一对零、一对一的关系。
您是否考虑过问题表和答案表?
我正在使用 SQL Server;您还没有指定您使用的是什么 DBMS。
您可以在表上放置一个约束
dbo.Answers
以匹配QuestionTypeID
以防止添加无效条目。如果大多数列都是空白的,您应该查看Entity-Attribute-Value方法。这很好地处理了稀疏列并且可以为您节省大量空间。如果你正在设计一个有多个答案和类型的问题,你可以按以下方式设计它:
受访者表:
答案类型表:
问题表:
答题表:
一些注意事项:
这样做的好处是不必为可选问题存储空白答案。由于问卷通常遵循可选路径,这意味着您不会存储受访者未遍历的路径的详细信息。
一个简短的说明是,您应该
在显示
问题时(以确保您可以呈现正确的项目,例如日期选择器)和提交数据时(以确保您收到正确的
类型)。
这样做的缺点是总是将答案存储在需要转换为特定类型以执行
计算的文本字段中。或者,一个优点是可以在
Answers 表上建立索引,这将使数据检索非常高效。
大多数 DBMS 通常只存储 varchar 类型的使用部分,
这意味着您尽可能节省空间。
Answer 表中的数据可以很容易地在视图中旋转,以获得数据的“正常”视图,每个人每行有一个答案。