gpt4 book ai didi

MySQL 性能 : NOT NULL UNIQUE constraint on natural keys vs separate natural key => surrogate key mappings (tables)

转载 作者:行者123 更新时间:2023-11-29 00:53:59 30 4
gpt4 key购买 nike

这是一个小设计,在自然键上具有常见的 NOT NULL UNIQUE 约束:

CREATE TABLE 'users' {
id int(10) NOT NULL AUTO_INCREMENT,
name NOT NULL UNIQUE,
email NOT NULL UNIQUE,
pass NOT NULL,
PRIMARY KEY ('id')
}

NOT NULL UNIQUE 约束对我来说似乎很老套。具有不相交的候选键对我来说似乎是非规范化的,并且 UNIQUE 约束似乎是一个臃肿的 O(N) 检查功能,所以我倾向于使用一种设计,该设计对每个自然键都有一个关系,将自然键映射到代理键在主要关系中。

CREATE TABLE users {
id int(10) NOT NULL AUTO_INCREMENT,
pass NOT NULL,
PRIMARY KEY ('id')
}
CREATE TABLE user_names {
name NOT NULL,
user_id NOT NULL,
PRIMARY KEY ('name')
}
CREATE TABLE user_emails {
email NOT NULL,
user_id NOT NULL,
PRIMARY KEY ('email')
}

通过这种方式,我隐式地对用户的电子邮件和用户名实现了唯一约束,同时提供了能够在 O(ln N + ln M) 时间内使用他们的电子邮件或姓名搜索用户信息的奢侈(我非常喜欢欲望)。

我能看到第一个更常见的设计与第二个设计的性能相匹配的唯一方法是,如果 UNIQUE 约束隐式索引表,以便选择,并因此检查自然键的唯一性,可以完成在 O(ln N) 时间内。

我想我的问题是,关于使用自然键的性能插入和选择,处理具有 3 个或更多自然键并由代理键索引的表的最佳方法是什么?

最佳答案

看来你描述的是6th Normal Form .假设您的原始表在 5NF 中,那么由 3 个表组成的新模式在 6NF 中。拥有三个候选 key 不违反 5NF,但会违反 6NF。

然而,从数据完整性的角度来看,6NF 有明显的缺点。通常情况下会丢失一些依赖项。例如,您的原始表强制执行每个用户都有名称和密码的约束。您的 6NF 版本无法做到这一点——如果您想允许对所有表进行插入,至少在 SQL 中不能。 6NF 对于某些特定情况(时间数据)很有用,但从数据完整性的角度来看,通常 5NF 更有用和可取。

这没有回答您的性能问题,但我认为值得指出。

关于MySQL 性能 : NOT NULL UNIQUE constraint on natural keys vs separate natural key => surrogate key mappings (tables),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984696/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com