对于系统中的两个不同的配置文件(就我而言,教师和学生)来说,概括一个配置文件表是否有意义?我正在这样做,只是想对我的设计方法进行一般的健全性检查。回应表示赞赏。背景如下:
我们正在构建一个既有教师又有学生的网络系统。两者都在系统中拥有帐户。两者在系统中都有配置文件。
我的问题是关于这些配置文件表的表设计。
就与其关联的元数据而言,教师个人资料是相当静态的。每个老师都有一定数量的字段来公开有关该个人的信息(学校、学位等)。然而,学生的情况则不同。我们正在使用 Windows 服务从无穷无尽的 Excel 电子表格中提取有关学生的各种数据。
数据被移入我们的数据库,然后字段与学生的个人资料关联显示。因此,每个学生的个人资料中可能有非常不同的领域。
我最初是从三个表的概念开始的:
帐户
AccountID
教师简介
TeacherProfileID
AccountID
SecondarySchool
University
YearsTeaching
Etc...
学生文件
StudentProfileID
AccountID
Header
Value
StudentProfiles
表将保存 Excel 电子表格中的列标题的名称以及关联的值。
此后,我对设计进行了一些改进,以便根据所附的 ERD 图像更通用地处理配置文件。教师和学生的“标题”存储在名为 ProfileAttributeTypes
的表中,响应(来自 Excel 文档或通过 Web 表单上的输入字段)放入 ProfileAttributes
中 table 。这样,学生和教师的个人资料都可以与动态的个人资料字段流相关联。 “权限”表告诉我们我们正在与学生还是教师打交道。
由于该系统可能会快速增长,因此我想确保基础扎实。您能否提供有关此设计的反馈,并让我知道它是否合理,或者您是否可以看到它可能产生的问题,如果是这样,什么可能是更好的方法?
提前致谢。
最佳答案
属性包方法
您建议的数据模型依赖于“属性包”(配置文件的键值项的集合)。该模型的优雅之处在于您可以扩展属性而无需更改数据模型。
缺点是您经常需要“旋转”数据,并且您的表(和索引)的大小会很快膨胀。 (我的经验:50K 记录的每个键 200 个属性 = 1000 万个属性,没有任何跟踪属性更改的信息。)
如果您主要需要查询某个特定属性的键,则可以推荐此模型。思考诸如“有多少人拥有数学学位?”之类的问题。其中数学学位是属性键。
Xml 字段方法
通过此策略,我们将一个“xml”字段添加到 Profiles
表中,该表以 xml 的形式获取属性列表。该模型还允许您扩展属性的数量,而无需进行数据模型更改。
Sql Server 对此类字段有很好的支持(通过 xpath 查询、xml 索引等),好处当然是您可以保留一个简单的数据模型,该模型允许您在 xml 字段中存储您喜欢的任何内容。
当字段内容被整体替换时,推荐使用这种模型,可以通过xpath查询更改xml字段中的数据,但速度相当慢。
稀疏列
Sparse Column SQL Server 2008 中引入了一个系统,允许您在一个表中创建许多不同的字段,而这些字段的填充并不密集。好处是它允许您创建比 1024 限制更多的列,并且未填充的字段在未填充时不会占用空间。
缺点是您需要预先了解所有可能的字段,否则每次遇到新字段时您都会看到数据模型发生变化。如果表中大部分为空列,则此模型非常有用。
采取哪种方法?
这是最困难的部分,这完全取决于您想对数据做什么。根据我的经验,如果您不需要跟踪属性的更改,则属性包方法适用于小型数据集。 (我见过1个月后表中记录超过10亿条的情况)
当您经常需要查询字段的特定内容时,Xml 字段可能会非常痛苦,但它非常适合存储仅“按键”请求的信息
当列中填充的记录少于 30%-40% 时,稀疏列效果很好。
附加说明:在数据模型中存储“教学年数”之类的内容被认为是一种不好的做法,因为您必须始终更新该值。最好存储“教学开始年份”并计算增量。
关于sql-server-2008 - 寻找具有动态列的配置文件表的 SQL Server 表设计健全性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10052045/