代码之家  ›  专栏  ›  技术社区  ›  Moshe Shaham

什么是最佳实践-新列或新表?

  •  1
  • Moshe Shaham  · 技术社区  · 7 年前

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

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

    因此,我的问题是,以下哪种选择在性能方面更正确、更好:

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

    2. 有一个新的表叫做用户超级大国,它最多包含10条记录,并将用户映射到超级大国。

    我想到了一些事情:

    第一个选择似乎是浪费空间,但它实际上只是一个英格尔…

    B.第二个选项要求每次查询用户时都使用左连接…

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

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

    2 回复  |  直到 7 年前
        1
  •  4
  •   Gordon Linoff    7 年前

    这可能是个意见问题。我的观点如下:

    如果 superpower 是用户的一个属性,您没有添加属性的习惯,那么您应该将其添加为列。10000*4个额外字节的开销不大。

    如果 超级大国 只是一个属性,您可以添加其他属性,然后我建议使用json或另一个eav表来存储该值。

    如果 超级大国 是具有其他属性和日期等的新用户类型,然后创建另一个表。在这个表中,主键可以是 user_id ,使表之间的连接更加高效。

        2
  •  1
  •   Tim Biegeleisen    7 年前

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

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