在创建新索引时,人们似乎在尝试避免在索引中出现漏洞,并通常使用自动增量。但为什么?背后的原因是什么?保养?安全?还是根本不漂亮?
因为就我而言,我想创建一个图书目录数据库,并且出于一致性的原因,我想确保“图书”表的索引与对应于第一版的出版号的ISBN号的片段匹配这本书的出版商。
但是,某些重新发行有其自己的ISBN,但本身不会被视为图书实体,因此会产生漏洞(重新发行的数据将与第一版数据合并)。
我将MySQL 5.7.23与phpMyAdmin结合使用。
在这里,我瞄准的是“ Book”和“ ISBN”表的交汇处的视图
num_book | ISBN
--------------------------------
1 | XXX-X-XXXXXX-1-X
| XXX-X-XXXXXX-5-X
| XXX-X-XXXXXX-9-X
| XXX-X-XXXXXX-14-X
2 | XXX-X-XXXXXX-2-X
3 | XXX-X-XXXXXX-3-X
| XXX-X-XXXXXX-6-X
| XXX-X-XXXXXX-8-X
4 | XXX-X-XXXXXX-4-X
7 | XXX-X-XXXXXX-7-X
| XXX-X-XXXXXX-13-X
10 | XXX-X-XXXXXX-10-X
11 | XXX-X-XXXXXX-11-X
12 | XXX-X-XXXXXX-12-X
15 | XXX-X-XXXXXX-15-X
我打算将“ num_block ”与这些有意的漏洞一起用作表的主键,然后与ISBN表联接。
索引号将保持增加,但不一定是连续的(即1、2、3、4、7、10、11、12、15)
我应该为此担心吗?
谢谢您的关注。
编辑:
答案 0 :(得分:1)
我认为您同时是在指几个不同的概念。
主键和索引之间有区别。
主键是一个逻辑概念-它提供对表中一行的唯一不变的引用。当其他实体引用主键时,它不能为空。
索引是一个物理概念-它是数据库在该列中查找条目的一种方式。您可以指定索引不为空且唯一。
物理上实现主键逻辑概念的通常方法是通过唯一的非空索引。
下一个问题是如何分配主键;有两个候选者:自然键反映问题域中的实体,代理键由数据库自动分配。
在实践中,自然键很少(保证唯一,不为null,不变)-我对ISBN的分配方式了解不足,无法确定它们是否合适。但是我已经看到了社会安全号码(他们被错误地输入到系统中),电话号码(人们更改了他们的电话号码)等问题。
代理键由数据库引擎分配。它们通常是自动递增的整数,但是它们也可以是UUID-只要保证它们是唯一的且不为null。自动递增整数很受欢迎的原因有两个。
许多主键是使用聚簇索引实现的。聚集索引会影响数据在磁盘上的存储顺序,因此,如果您有聚集索引,则在写入ID为1000的记录后插入ID为1的记录意味着要对磁盘上的数据重新排序。
间隙并不是真正的问题-只要按顺序插入即可。
但是...这种逻辑来自1980年代。那时,聚集索引明显比非聚集索引快。在现代硬件上,多数情况下并非如此。
因此,只要您对ISBN的分配方式充满信心,就没有明显的理由使您的分配主键的方案成为问题。