0

我有一个数据库结构如下:

 tbl_products
 -pk id (AutoIncrement)
 -name
 -description

 tbl_tags (1)   OR   tbl_tags (2)
 -pk name            -pk id (AutoIncrement)
                     -name (unique)

 tbl_products_tags
 -fk product_id
 -fk tag_id

我见过大多数选择数据结构 tbl_tags (2)。我想问我是否可以选择 tbl_tags(1) 因为名称总是唯一的,所以我想将其设为主要。它有什么缺点吗?

4

2 回答 2

3

如果您使标签名称唯一,则必须考虑如果需要更改名称,您将做什么。例如,如果我想将“标签”更改为“标签”。

如果这是一个主键,那么所有引用“标签”的子记录也必须更新,这样约束才有效。如果您有很多行引用给定名称,则运行此更改可能会很慢,并且会在您的应用程序中引入一些阻塞/争用。而如果您使用代理主键,您只需更新唯一名称字段,而不是所有子行。

如果您确定永远不会更新标签名称,那么您可以将其用作主键。但是请注意不断变化的需求!

当使用由外部来源发布和管理的代码(例如机场、货币和国家代码)时,自然键通常是有意义的。在这些情况下,您可以确保自然键不会更改,并且保证在域中是唯一的。

于 2013-01-26T16:01:02.097 回答
1

我的理解是,与选项 2 相比,在非常大的数据集的上下文中, tbl_tags (1) 会有边际性能损失。在较小的数据集中,可能不会那么多。机器可以比字符串更有效地处理整数。

但从更大的角度来看,在现代处理器速度的情况下,除了最大的数据集之外,两者之间的差异可能可以忽略不计。

当然,我这里说的是关系数据库。NoSQL 的各种风格是不同的动物。

此外,还有一致性问题。数据库中的其他表似乎都在使用(我假设是)一个自动递增的整数 ID。出于这个原因,我也会在标签表上使用它。

在设计数据库时使用自动递增整数 PK 字段与“自然键”是一个长期存在的争论。我的理解是,学术界在很大程度上更喜欢“自然键”的概念,而在实践中,某种形式的生成的唯一键往往是常态。

就个人而言,我更喜欢创建对最终用户没有意义的生成密钥,尽可能使用整数。除非我错过了什么,否则索引性能会显着提高。

于 2013-01-26T15:45:28.627 回答