【问题标题】:what is the best practice - a new column or a new table?最佳做法是什么 - 新列或新表?
【发布时间】:2018-07-11 11:20:39
【问题描述】:

我有一个用户表,其中包含许多属性,例如电子邮件、用户名、密码、电话等。

我想保存一种新型数据(整数),我们称之为“超级大国”,但只有极少数用户会拥有它。 users 表包含 10K+ 记录,而少于 10 个用户将拥有超能力(对于所有其他用户,它将为空)。

所以我的问题是以下哪个选项在性能方面更正确和更好:

  1. 在 users 表中添加另一个名为“superpower”的列,这对于几乎所有用户来说都是空的

  2. 有一个名为 users_superpower 的新表,其中最多包含 10 条记录,并将用户映射到超级大国。

我想到的一些事情:

一个。第一个选项看起来很浪费空间,但它真的只是一个ingeger......

b.每次我查询用户时,第二个选项都需要左连接...

c。例如,如果“超级大国”数据是 5 列,答案会改变吗?

注意:我使用的是 hibenate 和 mysql,如果它改变了答案

【问题讨论】:

  • 任何一个选项都可以。

标签: mysql sql hibernate


【解决方案1】:

这可能是一个见仁见智的问题。我对此的看法如下:

如果superpower是用户的属性,而你没有添加属性的习惯,那么你应该把它添加为一个列。 10,000*4 额外字节的开销不是很大。

如果superpower 只是一个属性并且您可以添加其他属性,那么我建议使用 JSON 或另一个 EAV 表来存储该值。

如果superpower真的是一个新类型的用户,还有其他属性和日期等等,那么再创建一个表。在这个表中,主键可以是user_id,使得表之间的连接更加高效。

【讨论】:

    【解决方案2】:

    我会在您的用户实体中添加一个新的布尔字段,以跟踪该用户是否具有超能力。

    感谢添加新表并链接它需要在您当前的用户表中创建一个外键,这个键将是另一个占用空间的列。所以它并没有真正绕过避免存储。如果您只想要一个非常小的列来存储用户是否具有超能力,您可以使用 boolean 变量,该变量将映射到 MySQL BIT(1) 列。因为这是一个固定宽度的列,NULL 值仍会占用一点空间,但与表的其余部分相比,这很可能不是一个大的存储问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 2011-07-14
      相关资源
      最近更新 更多