sten 百分位数 t 分数的数据库标准化

Database normalization for sten percentile t-score

我刚开始在 MySQL 中为我的数据库建模。

所以我有一个名为 "norms" 的 table,其中包含以下列:

id (int) -- 主键
fk_category_id (int) --- 来自另一个 table
的外键 raw_score_min (int) --- 范围
所需的下限分数 raw_score_max (max) --- 范围
所需的上限分数 sten (int) --- 标准十(取值1-10)备注
percentile (int) --- 百分比备注(取值1-100)
t-score (int) --- 另一个具有奇怪相关性的评论
fk_classification_id --- 来自另一个 table

的外键

现在,并非此数据库中的每一行都将使用 sten、百分位数和 t 分数。

大多数情况下只会使用这三个中的一个。 但是,在特殊情况下,将使用三分之二(即 sten 和百分位数)

因此,如果行堆积起来,table 将有很多行的 sten、percentil 和 t-score

的值为 0 的浪费列

有什么方法可以避免使用规范化造成的浪费?谢谢!


更新:
我忘了告诉你,随着系统的运行,"standards"(sten、t-score、percentile)可能会有其他类型,例如 CSQ 或其他标准。按照上面的 table,这可能意味着每次出现新类型 "standard" 时我都应该添加一个新列。

您可以创建一个新的 table,例如stats,其中将包含标准的 10、百分位和 t-score 值,用于那些具有它们的记录。

CREATE TABLE stats
(
    id int,          -- same id as used in the norms table
    sten int,
    percentile int,
    t-score int
);

请注意,此处的收益是因为您不会为那些没有任何统计信息的记录分配任何数据库存储空间。将此与原始问题中的非规范化方法进​​行对比,您可能会为该记录存储零值。

更新:

如果您确实需要添加 stats/columns,那么我预计无论是我的方法还是您原来的方法都会造成麻烦。通过规范化数据库,您仍然会获得潜在的收益。

但也许可以即时计算新的统计数据,而不是将其保存到数据库中。这将避免必须不断添加新列的问题。

回答你的问题,是的,你可以避免这种情况。例如,您可以单独执行 table norm_stennorm_percentilenorm_tscore 并引用 norm."id".

但是,您应该仔细检查这是否不会使您的应用程序逻辑过于复杂。由于整数字段仅使用 4 个字节,因此除非您有数百万条记录,否则您通常只会 运行 到 table space 问题。