【问题标题】:One table with 500 Billion records, how can I do that?一张表有 5000 亿条记录,我该怎么做?
【发布时间】:2018-04-06 20:33:29
【问题描述】:

我需要您在项目方面的帮助。我想设计多语言抽认卡数据库。为大量用户提供服务;每个用户可以拥有任意数量的卡片(单词)。出于统计目的,我必须存储每张卡片(单词)的所有学习历史。

假设,我们有 500000 个用户,每个用户有 10000 张卡片(字);每个单词大约有 100 条记录(例如,如果答案是对或错)。存储此历史记录的示例方法是使用下表:

User_Id,Word_Id,Date,Answer_Type

但是这个表会包含大量的记录,大约 5000 亿条记录。 有什么有效的方法可以做到,而且不影响查询时间。

【问题讨论】:

  • 这是一个“我想要一匹小马”的问题,它过于宽泛,无法给出具体的技术答案,因此在 Stack Overflow 上它是题外话。您需要尝试解决此问题并展示您的代码,以便我们了解您在技术层面上尝试做什么,并展示您解决此问题的承诺。
  • 您没有 500,000 个用户。你有零。为现实的目标而不是假设的情况而设计。如果您预计发布时会有 1000 人左右,请牢记这一目标。
  • 先得到10,000个条目才担心大约500,000,000,000..
  • 我认为你可以水平拆分数据。您可以对用户进行分区,例如,名称以“A”开头的用户位于一个表/数据库/服务器中,等等。具有“B”的用户位于不同的表/数据库/服务器中。依此类推字母表(或其他一些哈希)对单词和记录执行相同的操作。您将拥有很多数据库而不是单个数据库。这样,对用户“Adam”的查询甚至不会触及保存用户“Billy”数据的数据库。
  • @user2023861,考虑一下出于统计目的查询数十个表的情况。

标签: sql-server database-design


【解决方案1】:

我们团队中的一个人建议: (1) 使用 XML 并将其存储在数据库中。作为 XML 数据类型 (2) 将用户的话分成小组(Titles),每组大约20张卡片。卡的意思:正面一个字,反面就是意思。 (3) 使用word的属性(XML属性)来存储所有的历史条目。

例如:

<Group>
  GroupNo:01
  TotalCards=20
  ……
  <Card>
    CardNo=1;
    FrontWord=EnW98347;
    BackWord=CnW7536;
    History=20180301,1 + 20180315,0 + 20180330,1;
    ……;
    ……;
  </Card>
     ……;
  <Card>
    ……;
  </Card>
</Group>

其中:20180301,1=日期,真或假。

但我认为这个过程可能需要更多的查询时间。我们还需要更多的存储空间。 对此有任何建议或建议

【讨论】:

  • 如果您担心数据库膨胀,这与好的解决方案截然相反。 XML 不是一种非常有效的数据存储方法,也不是关系型的。
  • @tadman:就我而言,XML 可能不是好的解决方案。但为了您的信息,请访问:[链接] (docs.microsoft.com/en-us/sql/relational-databases/xml/…)
  • 最大的问题是你是否可以索引它,考虑到这里真正特殊的格式,我猜不会。
  • @alzeenahtrad,没有 SQL DBMS 包含 MAGICIAN,因此,归根结底,必须完全加载、解析 XML,并将找到的结构化信息存储为快速访问。就处理功耗而言,这整个过程并不是免费的。因此,无论何时何地您需要高频率执行此过程,这都是一个BAD IDEA
猜你喜欢
  • 2016-11-09
  • 2021-02-23
  • 1970-01-01
  • 2018-01-16
  • 2018-09-29
  • 2012-05-26
  • 1970-01-01
  • 2019-08-30
  • 2018-08-01
相关资源
最近更新 更多