最佳做法是什么-新列或新表?

时间:2018-07-11 11:20:39

标签: mysql sql hibernate

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

我想保存一种新型的数据(整数),我们称其为“超能力”,但是只有极少数的用户拥有它。用户表包含超过1万条记录,而拥有不到10个用户的超级用户(对于所有其他用户,则为null)。

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

  1. 在用户表中添加另一列“ superpower”,对于几乎所有用户该列都为空

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

一些我想过的事情:

a。第一种选择似乎浪费了空间,但实际上只是一个ingeger ...

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

c。例如,如果“ superpower”数据为5列,答案会改变吗?

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

2 个答案:

答案 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)值仍会占用一点空间,但是与表的其余部分相比,这不太可能引起很大的存储问题。