【发布时间】:2019-06-24 05:31:53
【问题描述】:
我经常遇到这样的情况:
table `user_adress`
+----------+-------------+--------------+---------+
|adress_id | user_id | adress_type |adress |
+----------+-------------+--------------+---------+
| 1 | 1 | home |adressXXX|
| 2 | 2 | home |adressXXX|
| 3 | 3 | home |adressXXX|
| 4 | 1 | work |adressXXX|
| 5 | 2 | work |adressXXX|
| 6 | 1 | second_home |adressXXX|
+----------+-------------+--------------+---------+
如果我想使用它,我会使用这样的查询:
SELECT `adress` FROM `user_adress` WHERE `user_id`=1;
看起来很正常,但问题是,我使用“无用”adress_id 列,它没有其他目的,只是为了在 MySQL 表中有一个主键而成为具有自动增量的主键。我从不使用或不需要这个号码。所以我发现我根本不应该在我的表中使用主键,完全删除adress_id,并在user_id 列设置INDEX(没有unique)。这似乎很好 - 还是我错了?
我有一些疑问,因为在我阅读的同时,我在任何地方看到的建议是,每个表都应该,甚至需要有主键。但为什么?如果我允许这种情况发生,也许我的数据库设计得很糟糕,但是看看我非常简单的示例表 - 我无法想象在每种情况下都会出现这种情况,尤其是在这种简单的情况下。我肯定误解了一些关于创建表和正确索引它们的简单基本规则——我的问题在哪里?
【问题讨论】:
-
如何在不删除用户 1 的工作地址和 second_home 地址的情况下删除用户 1 的家庭地址?即使您对此有计划,如果不满足主键的假设,某些框架/环境也无法充分发挥作用。
-
你完全正确,我扩展了示例表 - 我的错误!
-
user_id, address_type可以被视为候选主键,但如果某人有三个家庭住址,则必须添加新的地址类型。不管怎样,你最终还是会得到一个主键。它只是复合的,任何引用地址的东西(可能是账单或送货地址)现在都必须在两个值而不是一个值上连接/查询。 -
注意:使用非递增主键(或无主键)时,InnoDB 可能会对性能产生重大影响:kccoder.com/mysql/uuid-vs-int-insert-performance 像 Galera 这样的一些复制系统也需要一个。
-
@ceejayoz - 链接到一个糟糕的测试。没有一个 hist 表有
PRIMARY KEY,这对 InnoDB 来说是必不可少的。而且图表飞向天空的速度太快了。而且他没有说innodb_buffer_pool_size使用了什么值。但结论有些正确:在某些情况下,UUID 会降低性能。
标签: mysql indexing database-design primary-key