现在我正在设计我的 MySQL 数据库。让我们从用户表和评论表开始。我们看到的主要是评论的作者存储为整数。但是,它需要使用左连接,并且当应用程序变得更大时,您在一个查询中需要很少的左连接。最后会产生复杂的查询。我可以制作没有整数的用户表吗?评论的作者将与他的用户名一起存储。
此外,foreign keys
在 MySQL 中有。如果我使用它们,我有哪些实际优势?
注意:我使用 UTF-8,应用程序(类似于字典(第一手银河百科全书))将使用西里尔字母。
现在我正在设计我的 MySQL 数据库。让我们从用户表和评论表开始。我们看到的主要是评论的作者存储为整数。但是,它需要使用左连接,并且当应用程序变得更大时,您在一个查询中需要很少的左连接。最后会产生复杂的查询。我可以制作没有整数的用户表吗?评论的作者将与他的用户名一起存储。
此外,foreign keys
在 MySQL 中有。如果我使用它们,我有哪些实际优势?
注意:我使用 UTF-8,应用程序(类似于字典(第一手银河百科全书))将使用西里尔字母。
您可以。但这会增加任何连接的处理开销——使用数字键要快得多。
查询中的几个连接非常好......比非规范化或为“方便”进行其他数据级别更改要好得多
我强烈建议您在用户表中使用整数作为键,将字段设置为自动递增以保证唯一性,因此您不必自己设置。然后在您的评论或其他表格中设置一个外键。主键字段将被索引,您最好将其作为整数。这个概念很可能适用于您的数据库设计中的许多其他地方。
如果您没有充分的理由不使用代理键,请使用它们。
它们使您的生活变得如此轻松,因为根据定义,它们是您实体的唯一标识符,在整个实体的生活中都无法改变。
对于像用户名这样的自然主键,情况并非如此。因为它们很自然,所以它们依赖于应用程序数据。由于功能需求的变化,今天有效的应用程序数据的约束明天可能会失效。功能需求通常不受您的控制,因为您的客户决定了它们。因此,通常将架构建立在您无法控制自己的约束上是不好的。
因此,请使用代理键,除非您有充分的理由不使用它们。
实际上很难确定哪个选项更好,因为它取决于许多因素(用户能否更改他的用户名?您是否允许未注册用户发表评论?等等)
请考虑一个解决方案,在comments
表中存储用户名和数字用户 ID。通过这种方式,您可以对数据进行非规范化,但可以获得一些性能优势(您实际上存储了用户名,因为它是在放置评论的那一刻,所以它实际上不是非规范化 - 严格来说。:])。