MySQL 高效:多个表或列有空值
MySQL efficient: multiple tables or columns with nulls
我正在为用户列表开发 MySQL 数据库,我正在尝试确定最有效的设计方法。
我的问题在于有 3 种类型的用户:"general"、"normal" 和 "super"。一般用户和普通用户仅在某些列的值上有所不同,因此存储它们的模式是相同的。但是,超级用户至少有 4 列额外的信息需要存储。
此外,每个用户都需要一个唯一的 user_id
供网站其他部分参考。
所以,我可以将所有 3 个用户都保留在同一个 table 中,但是这样我会为一般用户行和普通用户行存储很多 NULL
值。
或者,我可以将用户分成 2 tables:general/normal 和 super。这将摆脱 NULLs
的丰富性,但需要做更多的工作来跟踪 user_ids 并确保它们是唯一的,因为我必须在我的 [=37= 中处理它] 而不是在上面的单个 table 解决方案中只做一个 SERIAL
列。
哪种解决方案在内存使用和性能方面更高效?
或者还有其他我没有看到的更好的解决方案吗?
谢谢!
为什么不多建一个 table;但仅适用于超级用户所需的额外列?所以 2 table 一个包含所有用户,一个包含超级用户的额外信息
如果你想要这种模式。尝试建立关系
喜欢:
tb_user > user_id , user_type_id(整数)
tb_user_type > user_type_id(int) , type_name
这样您将只有 2 个表,如果未设置类型,您可以为用户设置默认值。
如果每个用户都需要一个唯一的 ID,那么您的问题就有了答案:您想要一个 users
table 和 UserId
列。通常,该列将是一个自动递增的整数主键列——一种很好的实现方法。
其他列怎么办?这取决于许多不同的因素,这些因素在您的问题中没有得到很好的解释。
您可以将所有列存储在同一个table中。事实上,您随后可以实现视图,以便您只能看到一种类型的用户。但是,如果很多额外的列是固定宽度的(例如数字),那么 space 仍然会被分配。这是否是一个问题只是列的性质和不同用户的相对数量的问题。
您还可以将每种类型的额外列存储在其自己的 table 中。这将与原始 table 具有外键关系,使用 UserId
。如果这两个键都是主键,那么 join
s 应该非常快。
还有更多奇异的可能性。如果不需要对列进行索引,那么 MySQL 5.7 支持 JSON,因此它们可以全部进入一列。某些数据库(尤其是面向列的数据库)允许 "vertical partitioning",其中单个 table 中的不同列存储在单独的分配单元中。 MySQL(尚)不支持垂直分区。
我正在为用户列表开发 MySQL 数据库,我正在尝试确定最有效的设计方法。
我的问题在于有 3 种类型的用户:"general"、"normal" 和 "super"。一般用户和普通用户仅在某些列的值上有所不同,因此存储它们的模式是相同的。但是,超级用户至少有 4 列额外的信息需要存储。
此外,每个用户都需要一个唯一的 user_id
供网站其他部分参考。
所以,我可以将所有 3 个用户都保留在同一个 table 中,但是这样我会为一般用户行和普通用户行存储很多 NULL
值。
或者,我可以将用户分成 2 tables:general/normal 和 super。这将摆脱 NULLs
的丰富性,但需要做更多的工作来跟踪 user_ids 并确保它们是唯一的,因为我必须在我的 [=37= 中处理它] 而不是在上面的单个 table 解决方案中只做一个 SERIAL
列。
哪种解决方案在内存使用和性能方面更高效?
或者还有其他我没有看到的更好的解决方案吗?
谢谢!
为什么不多建一个 table;但仅适用于超级用户所需的额外列?所以 2 table 一个包含所有用户,一个包含超级用户的额外信息
如果你想要这种模式。尝试建立关系
喜欢:
tb_user > user_id , user_type_id(整数)
tb_user_type > user_type_id(int) , type_name
这样您将只有 2 个表,如果未设置类型,您可以为用户设置默认值。
如果每个用户都需要一个唯一的 ID,那么您的问题就有了答案:您想要一个 users
table 和 UserId
列。通常,该列将是一个自动递增的整数主键列——一种很好的实现方法。
其他列怎么办?这取决于许多不同的因素,这些因素在您的问题中没有得到很好的解释。
您可以将所有列存储在同一个table中。事实上,您随后可以实现视图,以便您只能看到一种类型的用户。但是,如果很多额外的列是固定宽度的(例如数字),那么 space 仍然会被分配。这是否是一个问题只是列的性质和不同用户的相对数量的问题。
您还可以将每种类型的额外列存储在其自己的 table 中。这将与原始 table 具有外键关系,使用 UserId
。如果这两个键都是主键,那么 join
s 应该非常快。
还有更多奇异的可能性。如果不需要对列进行索引,那么 MySQL 5.7 支持 JSON,因此它们可以全部进入一列。某些数据库(尤其是面向列的数据库)允许 "vertical partitioning",其中单个 table 中的不同列存储在单独的分配单元中。 MySQL(尚)不支持垂直分区。