【问题标题】:Redshift Usage - 1 row by 400 columns per user or (20-400) rows by 4 columns per userRedshift 使用 - 每个用户 1 行 x 400 列或(20-400)行 x 4 列每个用户
【发布时间】:2015-04-09 07:44:53
【问题描述】:

我们正在构建一个分析引擎,该引擎必须存储每个用户的属性偏好分数。我们预计有 400 个属性,它们可能会改变(频率未知)。我们计划将其存储在 Redshift 中。

我的问题是:

  1. 我们是否应该将每个用户存储为 1 行和 400 列(每个属性 1 列) 还是我们应该选择像这样的表结构 (uid, 属性 id, 属性值, 偏好分数) 这将是 (20-400) 行乘 3 列 哪种存储会在 Redshift 中带来更好的性能。

  2. 真的应该为此考虑 NoSQL 吗?

注意: 1.这是一个实时应用程序的后端,用户越来越多。 2. 处理时,上表必须读取一个用户所有属性的全部信息,即在运行时间接创建一个 1*400 矩阵。

请帮助我哪种设计最适合这种用例。谢谢

【问题讨论】:

  • 我不知道redshift,但是在普通的sql数据库中,最好有更多的小表而不是一个大表。最好创建更多更小的逻辑表。比如地址、个人信息等。
  • 但是一张表应该有更多的列或更多的行..哪种设计更好读起来更快?
  • 根据我使用 oracleSql 的经验,当行数超过 100 000 时,我有很长时间加载更多行。另一方面,当您尝试这样的操作时,很多列都是问题select * from tbl .或者您想插入或更新表。在设计中的更多行上,数据的可读性也存在问题。
  • 对不起,我无法理解你的意思。你能详细说明一下吗?
  • 好的,我试试:行数多:select * from tbl 如果行数 > 100 000 则需要几分钟。数据的可读性要低得多。例如,对于每个用户,您都有 400 行的 uid、属性 id、属性值、偏好分数。当您尝试使用这些数据时,会非常困难。大量列:这意味着糟糕的数据库设计。此表中的每次插入或更新都会很慢,select * from tbl 也会很慢。

标签: mysql database amazon-redshift nosql


【解决方案1】:

您可以使用本示例中给出的表格,然后使用按位函数

http://docs.aws.amazon.com/redshift/latest/dg/r_bitwise_examples.html

按位函数为here

【讨论】:

  • 这个解决方案很有趣。但我有一个分数表,即在 0 和 1 之间。例如。每个用户的一行,每个属性值为 0.5 的列,这样我可以为每个用户设置 400 列。怎么能用这个来存储呢?
  • 您需要为每列存储标志 1 或 0。然后将 63 到 64 列组合在一起以在列上创建。这将创建像 1001010101010 这样的二进制文件......将其存储在一列中,依此类推......
  • 但我的分数不是 0 或 1..它是一个介于 0 和 1 之间的数字。我们如何做到这一点?例如。 0.5, 0.66,0.65
  • 如果你有 0 或 1(二进制)这更适合,对于其他人你需要一些其他的解决方案
【解决方案2】:

对于您的问题,我建议使用两个表设计。一开始比较痛苦,但以后会有所帮助。

第一个表将是第一个表的键值类型,它将存储所有基本数据,并且是一种未来证明,您可以在其中添加/删除更多属性,但该表将继续工作。

还有一个 N(在您的情况下为 400)列第 2 表。您可以使用第一个表构建第二个表。对于第二个表,您可以从最少的列集开始。假设这 400 个列中只有 50 个。这样查询这个表会非常快。并且该表的结构可以定期刷新以匹配当前的报告要求。此外,您将始终拥有基表,以防您需要回填任何数据。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2012-10-04
    • 1970-01-01
    • 2021-07-28
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多