MySQL高效:多个表或带空值的列

时间:2015-06-29 14:30:42

标签: php mysql schema

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

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

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

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

或者,我可以将用户分成两个表:general / normal和super。这将消除NULLs的丰富,但需要更多的工作来跟踪user_ids并确保它们是唯一的,因为我必须在PHP中处理它而不是仅仅执行{{{ 1}}上面单表解决方案中的列。

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

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

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

为什么不建一个额外的桌子;但只有超级用户需要额外的颜色?所以2个表一个包含所有用户,另一个包含超级用户的额外信息

答案 2 :(得分:0)

如果您想拥有此类型的架构。尝试创建关系

像:

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

这样你只有2个表,如果没有设置类型,你可以为用户设置一个默认值。

相关问题