我有一个users表,它包含很多属性,比如email、用户名、密码、电话等等。
我想保存一个新类型的数据(整数),让我们称之为“超级能力”,但只有很少的用户会有它。users表包含10k+条记录,而只有不到10个用户拥有超级能力(对于所有其他用户,它将为空)。
因此,我的问题是,以下哪种选择在性能方面更正确、更好:
在users表中添加另一个名为“superpower”的列,该列对于几乎所有用户都是空的
有一个名为users\u superpower的新表,它最多包含10条记录,并将用户Map到superpower。
我想了一些事情:
答。第一种选择似乎是浪费空间,但它真的只是一个ingeger。。。
b。第二个选项将需要一个左连接每次我查询用户。。。
c。例如,如果“超级大国”的数据是5列,答案会改变吗?
注意:我使用的是hibenate和mysql,如果它改变了答案的话
2条答案
按热度按时间ffvjumwh1#
我只想在您的用户实体中添加一个新的布尔字段,用于跟踪该用户是否具有超能力。
请注意,添加一个新表并链接它需要在当前用户表中创建一个外键,而这个键将是另一个占用空间的列。所以它并没有真正避开存储。如果你只需要一个很小的列来存储用户是否有超能力,你可以使用
boolean
变量,它将Map到mysqlBIT(1)
列。因为这是一个固定宽度的列,NULL
值仍然会占用一点空间,但与表的其他部分相比,这并不是一个很大的存储问题。kognpnkq2#
这可能是一个意见问题。我的观点如下:
如果
superpower
是用户的一个属性,并且您没有添加属性的习惯,那么您应该将其作为列添加。10000*4额外字节的开销不大。如果
superpower
只是一个属性,您可以添加其他属性,然后我建议使用json或其他eav表来存储该值。如果
superpower
确实是一个新类型的用户,具有其他属性和日期等,然后创建另一个表。在这个表中,主键可以是user_id
,使表之间的联接更加高效。