【问题标题】:MySQL efficient: multiple tables or columns with nullsMySQL 高效:具有空值的多个表或列
【发布时间】:2015-06-29 22:41:51
【问题描述】:

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

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

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

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

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

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

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

谢谢!

【问题讨论】:

  • 将您的用户放在一张桌子上。
  • 由于您不能使用 PHP 或任何其他语言来强制执行参照完整性,因此您提出的让 PHP 管理数据库唯一性的解决方案是不可能的。我会选择一张桌子,毫无疑问。 4 个可为空的列根本不是什么大问题,如果您的用户在逻辑上适合一个表 - 无需将其拆分为多个表。它不会变得更快,但是在游戏中添加一个额外的表格只会增加您的应用程序的复杂性,而这是您真正不想要的。

标签: php mysql schema


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    为什么不建一个额外的桌子;但仅适用于超级用户所需的额外列?所以 2 张表,一张是所有用户,一张是超级用户的额外信息

    【讨论】:

    • 这对我来说似乎是最简单的解决方案,而且到目前为止效果很好。谢谢!
    【解决方案3】:

    如果你想拥有这种类型的架构。尝试建立关系

    喜欢:

    tb_user > user_id , user_type_id(int)
    tb_user_type > user_type_id(int) , type_name

    这样您将只有 2 个表,如果未设置类型,您可以为用户设置默认值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      相关资源
      最近更新 更多