SQL数据库中的重复/不必要的数据

Wil*_*Wil 3 sql database-design data-modeling

在为多个用户设计新的应用程序/数据库时,通常需要有一个用于用户管理的表.

该表通常始终具有用户名和ID ....

只是为了检查我是不是一个白痴(好吧,你可能仍然认为!)我刚下载并看了MediaWiki和PHPBB的架构,他们也这样做.

当我第一次了解关系数据库时,我总是被告知,一个重要的规则是永远不会复制数据或做任何不必要的事情.

那么,为什么我们将ID作为主键而不是用户名呢?

我理解它不是唯一的原因(例如SO系列网站),但是在这些应用程序中,它是.

我唯一能想到的是做一个Select * from xxx where ID="454"代替Select * from xxx where name="some_really_long_name"或者因为真正长名称会增加数据库大小的速度更快.

这些是唯一的原因,还是我错过了什么?

Lar*_*tig 9

使用整数非智能主键代替唯一文本键的原因:

  1. JOIN和其他查询的速度.

  2. 能够更改文本键值并保持数据库的完整性,而无需更新引用键的每个表.

  3. 当应用程序必须在内存中构建键值列表时,可以提高代码效率并减少内存开销.

  4. 减少引用密钥的表的大小.


Cha*_*ana 7

密钥服务于两个完全不同的目的,一个是防止插入重复的行....这并不意味着数据值都是相同的,这意味着这两行代表相同的真实世界实体.只有有意义的自然键才能实现这一点.
第二个目的是充当依赖表中外键列的目标.
为此,最窄的(最小字节数)密钥将在与密钥一起使用的索引上生成最佳性能,并在执行搜索时使用.

因此,当自然键由多列组成或非常宽时,有时建议创建第二个备用或代理键,以用作其他表中FK引用的目标.这通常是在数据库中创建的内部创建的值,它不会暴露在应用程序或系统之外,甚至可能不在数据库组件本身之外.

如果那是唯一的密钥,因为它不是一个有意义的或自然的密钥,它完全不足以确保数据的一致性,因为两行代表同一个实体,并且所有属性的区别仅在于无意义的代理密钥,仍然可以插入表中.
因此,在这种情况下,将两个键放在桌面上是一种好习惯.

除了经常用于提高性能之外,代理键还具有额外的优点(因为它们没有意义),不需要改变.提供最好的自然键,准确而独特地识别实体,永远不需要改变,是一种艺术形式,很容易做得很差.(SSAN是一个规范示例)然后,如果真实世界实体更改了设计不佳的自然键中使用的任何值,并且您将其用作唯一的键,(因此作为其他地方的FK),您将不得不更改数据库中的任何值,包括在您将其用作外键的所有其他表中.