我正在为使用MySQL的电子商务网站设计数据库。我已经制作了必要的表格列表以及表格所需的所有字段。我总共有9张桌子。
我所做的是在所有表中包含一个自动递增ID作为主键。
除了2之外的所有表格都归一化为3NF。两个表'用户'和' outlet'未标准化为2NF。
在此过程中,我意识到使用自动递增ID作为主键时,规范化很麻烦。由于不严格要求规范化,我想知道在所有表中使用自动递增ID作为主键是否有任何缺点?
答案 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)
我建议使用GUID - uniqueidentifier作为主键,以取代将来的任何限制。
MSSQL:https://docs.microsoft.com/en-us/sql/t-sql/data-types/uniqueidentifier-transact-sql
MySQL的: https://forums.asp.net/t/1458664.aspx?UNIQUEIDENTIFIER+data+type+in+MySql
http://mysqlserverteam.com/storing-uuid-values-in-mysql-tables/