我有一个表users
,其中包含多个用户信息。我想将用户特定权限存储在另一个表中。
我是否需要在user_permissinos
表中使用主键 up_id ,即使它不会在任何地方使用?
我知道总是建议在表中使用主键,但在这种情况下,对我来说没有任何意义。如果我需要加入两个表,我将在user_id上加入up_of_user。
Table `user`
==========================
user_id int(11) PK AI NN
user_name varchar(50)
...
Table `user_permissions`
=======================================
up_id int(11) PK AI NN
up_of_user int(11) FK of user.user_id
up_edit_post tinyint(4) DEFAULT '0'
答案 0 :(得分:1)
请阅读MySQL的文档:
表的主键表示您在最重要的查询中使用的列或列集。它具有关联的索引,以实现快速查询性能。查询性能受益于NOT NULL优化,因为它不能包含任何NULL值。使用InnoDB存储引擎,表格数据在物理上可以根据主键或列进行超快速查找和排序。
如果您的表很大且很重要,但没有明显的列或列集用作主键,则可以创建一个单独的列,其中包含自动增量值以用作主键。当您使用外键连接表时,这些唯一ID可以作为指向其他表中相应行的指针。
根据我的经验和知识,如果您没有定义主键,数据库将创建一个隐藏的主键。在你的情况下,我应该保留主键。
感谢@AaronDigulla的解释......:
必要吗?没有在幕后使用?好吧,它被保存到磁盘并保存在行缓存等中。删除会稍微提高你的性能(使用精确到毫秒精度的手表)。
但是...下次有人需要创建对此表的引用时,他们会诅咒你。如果他们勇敢,他们将添加PK(并等待DB创建列的时间很长)。如果他们不勇敢或愚蠢,他们将开始使用业务密钥(即数据列)创建引用,这将导致维护噩梦。
结论:由于拥有PK的成本(即使它没有使用ATM)是如此之小,所以就这样吧。
答案 1 :(得分:1)
InnoDB有3种PK选择:按顺序,
PRIMARY KEY(...)
- 最佳做法:始终这样做。UNIQUE(...)
列的第一个NON NULL
。 - 比#1更粗略。 AUTO_INCREMENT
与“自然”PK:
第一条规则:如果您有自然键,请使用它而不是添加人工ID。我创建的大约2/3的表具有“自然”PK,有时是“复合”(多列)。
第二条规则:如果您有多个辅助索引,则使用AI PK可能需要更少的空间。这是因为每个辅助密钥都包含PK的副本。
第三条规则:对于只有一个二级索引,这是一个折腾。
<强>实施例强>
老太太的故事又名“假新闻”
如果你有其他节省(例如,摆脱一个专栏),这可能会超越旧妻子的故事。
您的示例
抛出up_id
并宣传user_name
成为PK。
听起来user
和user_permissions
的关系是1:1?有两个具有相同PK的表是非常罕见的。通常情况下,这两个表应合并为一个。