【问题标题】:SQL - Potential 100K records out of 2M . Best method to design databaseSQL - 2M 中的潜在 100K 记录。设计数据库的最佳方法
【发布时间】:2017-07-02 09:34:33
【问题描述】:

我的基本表包含 30 列的 200 万条用户记录。

偶尔会有一项新活动开放,可能有 10 万用户参与(每个活动的不同组)。 每个用户都会进行一次自我认证,他/她的活动数据将被保存以供进一步使用。

设计数据库的最佳方法是什么?

  1. 将 100K 复制到 Users_In_Activity 表中,其中包含基表中所有必需和需要的详细信息。将为每条记录创建一个新的 PK(Users_In_Activity 主键)。

    • 在这种方法中,表格和搜索之间不会有连接 一条记录将由一个 PK (Users_In_Activity) 从仅 10 万条记录中完成。
  2. 将 100K 的用户基本详细信息复制到Potential_Users_In_Activity 表中以进行身份​​验证。将创建一个新的 PK(包括用户 PK),并将创建一个新的 User_In_activity PK。

    • 对于每个成功的身份验证,将在 Actual_Users_In_Activity 表中创建一条完整记录。
    • 将通过一个 PK (Users_In_Activity) 从仅 100K 的记录中搜索记录。
    • 在这种方法中,是在 2 个表之间加入一个 PK (Users_In_Activity)
  3. 对于每个成功的身份验证,将在 Actual_Users_In_Activity 表中创建一条完整记录。

    • 在这种方法中,没有连接,但搜索将来自所有 200 万条记录。

.

.

总结:

方法 1:创建 100K 的 30 列记录。从10万条记录中搜索,活动期间无需创建新记录。不需要加入。只能使用一张表。

方法 2:创建 100K 的 5 列。从 10 万条记录中搜索。在活动期间创建新记录(30 列)(仅限活动用户)。需要加入。 2 表工作

方法3:从2M的记录中搜索。在活动期间创建新记录(30 列)(仅限活动用户)。 2 表工作

【问题讨论】:

  • 您期望什么样的流量?读/写比率。
  • 为什么需要复制这 30 列?复制数据通常不是一个好主意。
  • @AntonínLejsek 不是真的。在当今的标准中,复制数据以进行高效查询是一个好主意。
  • 对于大多数用户,我预计每个用户的参与度为 30%(100K 中的 30K)——一次读取和一次写入。请记住,在一段时间内将有数百个活动(100K 表最终将成为历史记录的巨大表)。

标签: sql-server performance


【解决方案1】:

你没有讨论基本设计,

用户表=200万条记录,USERID为PK。该表只包含用户详细信息。

Activity Table=Activity Detail,ACtivityID 为 PK(此处与用户表无关)。此表包含每当创建新活动时的 Activity 详细信息。

User_Activity_Mapping=ActivityID,USERID(此处复制100K用户):此处为用户-活动关系表。

通过适当的索引,它可以正常工作。

告诉我

【讨论】:

  • 用户-活动关系表将在一段时间内变得巨大。在 2M 内搜索用户,然后根据活动的实际参与者数量执行插入(或更新)不是合乎逻辑吗?
  • @YanivBenYohana,好吧,我的怀疑,当活动首先分配给 100k 用户时,他们知道是潜在用户,但是当他们实际经过身份验证时,他们成为实际用户。潜在用户是临时的吗?曾经活动结束了,这些记录会发生什么。您会保留潜在用户的历史记录吗?解释我错过的任何其他事情。
  • 该活动包括向所有 100K 的人发送消息,并且需要保存历史记录(几列)。除此之外,如果用户实际参与(响应邀请),则需要记录 20 多个不同的数据。
  • 所以说在 100K 中,有 90K 实际参与,所以他们将保存在 20 列的差异表中。对吗?现在当活动结束时,那些 90K 记录会发生什么。它们会在那里还是没有用。 ?想象一下,在 5 次活动之后,您将拥有怎样的记录,那么这将是同样的事情。
猜你喜欢
  • 2019-04-20
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多