0

我想制作一个表格,将用户的操作反映给我的应用程序中的另一个用户。

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

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 值,仅当至少执行一个操作时才会创建此行

你能帮我理解为什么最好的选择是

原谅我的英语不好。
谢谢你

4

3 回答 3

1

绝对不是第二名。我会选择修改后的第一名:

ID | source_user_id | target_user_id | **action_id**

然后做一个表actions

ID | action_type | action_info | etc

这将允许您进行多种不同的操作,并且更加灵活。您说,“我将为其他用户可用的所有操作创建一行”......但是,根据您的布局,您真正的意思是您将为用户之间可用的每个操作创建另一。这是一种非常糟糕的处理方式。

于 2013-03-27T23:15:59.470 回答
1

为什么会更快?

为了获得特定用户的所有操作,第二个解决方案应该更快,尽管这可能只是一小部分。

对于添加新动作,第一个解决方案要快得多、快得多。第二种解决方案需要重新组织表格。

接下来,您不会说出您在第二种情况下放入列中的内容。如果您要输入 2,000 个字符长的字符串,那么第一种情况可能会快得多,尤其是 hellohellosharp 建议使用 ids 而不是值。较短的记录和减少的 I/O 应该可以弥补必须将大表连接到小参考表的情况。

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

于 2013-03-27T23:33:48.557 回答
0

在定义表结构之前,您首先必须确定哪些预期查询对性能至关重要?是否为and获取所有可用action的 ssourcetarget user?或者它是否获得了action_type您系统中当前可用的数量?表的构建方式可能会因此发生巨大变化。

在确定好之后,您可以使用许多技术来构建针对您的需求进行了优化的表,例如:

  1. 将通常一起检索的数据单元嵌入到同一个表中;
  2. 索引列;
  3. 还有很多,其中前两个是最基本的。
于 2013-03-27T23:33:08.170 回答