2013-03-27 86 views
0

我想制作一个表格,以反映用户在我的应用程序中的行为。什么表结构会给出更快的sql查询结果

我记得两个解决方案,我想知道什么会更快?

1)

ID | source_user_id | target_user_id | action_type 

在此选项中,我将创建一个行每个动作

2)

Id | source_user_id | target_user_id | action_x | action_y | action_z 

在此选项中,我将创建适用于所有行动的行其他用户, 未执行操作时,该字段将设置为NULL值 仅当至少执行一个操作时才会创建此行Rmed指

u能也帮助我理解为什么最好的选择将是

原谅我的英语不好。
谢谢

+0

的主要问题是,你不知道如何去衡量这一点。我不知道mysql,但我可以想象使用性能测试的方法。一个可能的和简单的解决方案将是要求谷歌。然而,从我的角度来看:#2更快,因为它避免了“JOIN”。但是,就我所记得的来说,设计表格结构是一种非常愚蠢的方式,因为它违反了3ND。 – alzaimar 2013-03-27 23:18:52

+1

主要问题是牺牲性能的正确性。速度杀死。对速度的需求甚至更多。 – wildplasser 2013-03-27 23:23:48

回答

1

为什么会更快?

为了获得特定用户的所有操作,第二种解决方案应该更快,尽管这可能只有少量。

为了添加新的动作,第一个解决方案要快得多,速度要快得多。第二种解决方案需要重新组织表格。

接下来,你不说你把什么入列对于第二种情况。如果你是在是2000个字符长的字符串推杆,那么第一种情况下会快得多,特别是通过使用而不是值的id hellohellosharp建议。较短的记录和减少的I/O应该弥补不得不将大表加入小型参考表。

因为你没有提供足够的信息,以实际回答您的有关性能的问题,最好的答案是专注于数据库设计。为此,一个动作表可能应该有一个自动递增的id,两个用户ID,一个动作ID和一个日期/时间字段。使用适当的索引,获取有关特定用户或用户/操作的信息应该对您的应用程序具有足够好的性能。

+0

你解释了所有可能的情况,我很担心选择和加入我的用户表,因为这会发生更多,我会在action_x,action_y,action_z – 2013-03-27 23:49:24

1

绝对不是二号。我会去与一个修改过的号码之一:

ID | source_user_id | target_user_id | **action_id** 

然后做一个表actions

ID | action_type | action_info | etc 

这将让你做出多种不同的动作和很多更灵活。你说,“我将创建一个可供其他用户使用的所有操作的行”......但根据您的布局,您的真正含义是您将为用户之间可用的每个操作创建另一个。这是一个非常糟糕的方式来处理这个问题。

0

在定义表结构之前,您首先必须决定您预期的哪些查询对性能至关重要?是否获取全部可用action s对于sourcetarget user?或者是得到您的系统当前有多少个action_type?桌子的搭建方式可能会有很大的不同。

后,非常确定的,您可以使用许多工艺建立了为您的需求而优化的表,如:

  1. 嵌入了通常在同一个表中检索数据一起单位;
  2. 索引列;
  3. 其中许多更多,其中前两个是最基本的。
+0

我的主要作用将得到什么动作我在其他用户执行的,当我搜索用户,并列出我已经在执行的操作的用户。 – 2013-03-28 12:56:59