为标记系统选择哪种数据库结构

时间:2013-01-26 15:11:32

标签: sql database-design

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

 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),因为名字总是唯一的,所以我想把它作为主要的。它有任何缺点吗?

2 个答案:

答案 0 :(得分:3)

如果您使标记名称唯一,则必须考虑如果需要更改名称,您将要执行的操作。例如,如果我想更改"标记"到"标签"。

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

如果您确定自己永远不会更新标记名称,则可以将其用作主键。但要注意不断变化的要求!

使用由外部来源(例如机场,货币和国家/地区代码)发布和管理的代码时,自然密钥通常是有意义的。在这些情况下,您可以确保自然密钥不会发生变化,并保证在域内是唯一的。

答案 1 :(得分:1)

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

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

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

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

使用自动递增整数PK字段vs"自然键"设计数据库是一个长期的争论。我的理解是学者们更喜欢"自然键"在实践中,某种形式的生成的唯一密钥往往是常态。

就个人而言,我更喜欢创建对最终用户没有意义的生成密钥,尽可能使用整数。除非我遗漏了某些内容,否则索引性能会显着提升。