我有一个用户表,其中包含许多属性,例如电子邮件,用户名,密码,电话等。
我想保存一种新型的数据(整数),我们称其为“超能力”,但是只有极少数的用户拥有它。用户表包含超过1万条记录,而拥有不到10个用户的超级用户(对于所有其他用户,则为null)。
所以我的问题是,以下哪个选项在性能方面更正确,更好:
在用户表中添加另一列“ superpower”,对于几乎所有用户该列都为空
具有一个名为users_superpower的新表,该表最多包含10条记录,并将用户映射到超级大国。
一些我想过的事情:
a。第一种选择似乎浪费了空间,但实际上只是一个ingeger ...
b。第二个选项每次我查询用户时都需要左联接...
c。例如,如果“ superpower”数据为5列,答案会改变吗?
注意:我正在使用hibenate和mysql,如果它改变了答案
答案 0 :(得分:4)
这可能是一个见解。我对此的看法如下:
如果superpower
是用户的属性,并且您不习惯于添加属性,则应将其添加为列。额外的10,000 * 4字节不是很多开销。
如果superpower
只是一个属性,您可以添加其他属性,那么我建议使用JSON或另一个EAV表来存储值。
如果superpower
确实是具有其他属性和日期等的新型用户,则创建另一个表。在此表中,主键可以是user_id
,使表之间的联接更加有效。
答案 1 :(得分:1)
我会在您的用户实体中添加一个新的布尔字段,以跟踪该用户是否具有超能力。
意识到添加一个新表并链接它需要在当前用户表中创建一个外键,而该键将是另一列占用空间的列。因此,避免存储并没有真正解决问题。如果只希望使用很小的列来存储用户是否具有超能力,则可以使用string text="Test Update � Coup�";
string decodedtxt = HttpUtility.HtmlDecode(text);
变量,该变量将映射到MySQL boolean
列。因为这是一个固定宽度的列,所以BIT(1)
值仍会占用一点空间,但是与表的其余部分相比,这不太可能引起很大的存储问题。