自动将ID作为所有表的主键递增

时间:2017-06-08 15:11:14

标签: mysql sql database design-patterns database-design

我正在为使用MySQL的电子商务网站设计数据库。我已经制作了必要的表格列表以及表格所需的所有字段。我总共有9张桌子。

我所做的是在所有表中包含一个自动递增ID作为主键。

除了2之外的所有表格都归一化为3NF。两个表'用户'和' outlet'未标准化为2NF。

在此过程中,我意识到使用自动递增ID作为主键时,规范化很麻烦。由于不严格要求规范化,我想知道在所有表中使用自动递增ID作为主键是否有任何缺点?

4 个答案:

答案 0 :(得分:1)

在所有表中使用自动递增ID作为主键很好。这将帮助您自动索引数据。如果您计划向我们提供任何ORM(例如Doctrine2),则每个表都必须有主键。

答案 1 :(得分:1)

你的问题被标记为MySQL,所以我要指出MySQL的InnoDB存储引擎使用主键作为所有表的聚簇索引。

在可能的情况下,通过聚簇索引进行查询会更有效。但是,如果您有一个任意规则,即使有另一列或一组列可以作为主键,所有表都必须使用自动增量主键,并且您始终运行按这些列而不是自动搜索的查询-increment列,那么你永远不会获得聚集索引查询的优势。

答案 2 :(得分:1)

我在我的时间里创造了很多桌子。我只使用了AUTO_INCREMENT的1/3。其余的东西看起来像是一个非常好的自然' PK",所以我走了。

"正常形式"是一本让你入门的教科书。在现实生活中(在我看来),NF后来在性能和其他考虑方面退居二线。

对于InnoDB表,你真的应该有显式 PRIMARY KEY(auto_inc或者自然)。

一个通用模式,其中auto_inc减慢速度是一个很多:许多映射表,正如Renzo指出的那样,我在这里讨论:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

在InnoDB中,PRIMARY KEY与数据一起存储(聚集),因此索引结构(BTree)几乎不占用额外的空间。每个二级索引占用一个单独的BTree,隐含地包含PK列。

答案 3 :(得分:0)