php - MySQL高效: multiple tables or columns with nulls

标签 php mysql schema

我正在为用户列表开发 MySQL 数据库,并且我正在尝试确定设计它的最有效方法。

我的问题在于,有 3 种类型的用户:“一般”、“普通”和“ super ”。普通用户和普通用户仅在某些列的值上有所不同,因此存储它们的模式是相同的。但是, super 用户至少需要存储 4 列额外的信息。

此外,每个用户都需要一个唯一的user_id,以供网站其他部分引用。

因此,我可以将所有 3 个用户保留在同一个表中,但是这样我就会为一般用户行和普通用户行存储大量 NULL 值。

或者,我可以将用户分为 2 个表:一般/普通和 super 。这将消除大量的 NULL,但需要做更多的工作来跟踪 user_ids 并确保它们是唯一的,因为我必须在 PHP 中处理它,而不仅仅是这样做上面单表解决方案中的 SERIAL 列。

哪种解决方案在内存使用和性能方面更高效?

或者还有其他我没有看到的更好的解决方案吗?

谢谢!

最佳答案

如果每个用户都需要一个唯一的 ID,那么您的问题就得到了答案:您需要一个带有 UserId 列的 users 表。通常,该列将是自动递增整数主键列——这是一种很好的实现方法。

如何处理其他列?这取决于许多不同的因素,您的问题中没有很好地解释这些因素。

可以将所有列存储在同一个表中。事实上,您可以实现 View ,这样您就只能看到一种类型的用户。但是,如果许多额外的列是固定宽度的(例如数字),则仍然会分配空间。这是否是一个问题只是列的性质和不同用户的相对数量的问题。

您还可以将每种类型的额外列存储在其自己的表中。这将使用 UserId 与原始表建立外键关系。如果这两个键都是主键,那么join应该非常快。

还有更多奇异的可能性。如果列不需要索引,那么 MySQL 5.7 支持 JSON,因此它们可以全部放入一列中。某些数据库(特别是面向列的数据库)允许“垂直分区”,其中单个表中的不同列存储在单独的分配单元中。 MySQL(尚)不支持垂直分区。

关于php - MySQL高效: multiple tables or columns with nulls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31118356/

相关文章:

php - 在 WordPress 中查询自定义表以首先返回最新行

php - 来自引用交易的 PNREF 能否用作另一引用交易中的 ORIGID?

php - SQL 计数返回 0

mysql - 在查询中序列化 MySQL 关系数据

database - 文档数据库中模式更改的模式

php - 代码处理时间太长,内存占用大

运行 mysql 查询的 Php 函数

mysql - 选择条件与单行匹配的行?

json - 基于 JSON 模式中的枚举值的属性

xml - 如何在 ActionScript 中针对 XML 架构测试 XML 的有效性?