sql-server-2008 - 寻找具有动态列的配置文件表的 SQL Server 表设计健全性检查

标签 sql-server-2008 dynamic user-profile

对于系统中的两个不同的配置文件(就我而言,教师和学生)来说,概括一个配置文件表是否有意义?我正在这样做,只是想对我的设计方法进行一般的健全性检查。回应表示赞赏。背景如下:

我们正在构建一个既有教师又有学生的网络系统。两者都在系统中拥有帐户。两者在系统中都有配置文件。

我的问题是关于这些配置文件表的表设计。

就与其关联的元数据而言,教师个人资料是相当静态的。每个老师都有一定数量的字段来公开有关该个人的信息(学校、学位等)。然而,学生的情况则不同。我们正在使用 Windows 服务从无穷无尽的 Excel 电子表格中提取有关学生的各种数据。

数据被移入我们的数据库,然后字段与学生的个人资料关联显示。因此,每个学生的个人资料中可能有非常不同的领域。

我最初是从三个表的概念开始的:

帐户

AccountID

教师简介

TeacherProfileID
AccountID
SecondarySchool
University
YearsTeaching
Etc...

学生文件

StudentProfileID
AccountID
Header
Value

StudentProfiles 表将保存 Excel 电子表格中的列标题的名称以及关联的值。

此后,我对设计进行了一些改进,以便根据所附的 ERD 图像更通用地处理配置文件。教师和学生的“标题”存储在名为 ProfileAttributeTypes 的表中,响应(来自 Excel 文档或通过 Web 表单上的输入字段)放入 ProfileAttributes 中 table 。这样,学生和教师的个人资料都可以与动态的个人资料字段流相关联。 “权限”表告诉我们我们正在与学生还是教师打交道。

由于该系统可能会快速增长,因此我想确保基础扎实。您能否提供有关此设计的反馈,并让我知道它是否合理,或者您是否可以看到它可能产生的问题,如果是这样,什么可能是更好的方法?

提前致谢。

profiles

最佳答案

属性包方法

您建议的数据模型依赖于“属性包”(配置文件的键值项的集合)。该模型的优雅之处在于您可以扩展属性而无需更改数据模型。

缺点是您经常需要“旋转”数据,并且您的表(和索引)的大小会很快膨胀。 (我的经验: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/

相关文章:

javascript - 如何展示这个集合?

sql - 从 SQL 查询生成的 KML 文件保存到本地驱动器

sql-server - 数据库读取在带有索引的查询上变化很大

sql - sp_MSForEachDB 在函数内无效使用副作用运算符

wpf - 带有用户控件的动态 WPF 数据网格

php - 打印出登录用户数据匹配登录SESSION

sql-server-2008 - 添加由 GROUP BY 子句产生的列

c - 如何在 C 中操作动态多维数组

Django : Formset as form field

java - 如何在谷歌登录另一个 Activity 后保存谷歌个人资料