【问题标题】:SimpleDB query on attribute nameSimpleDB 查询属性名称
【发布时间】:2010-06-18 19:38:18
【问题描述】:

我不知道使用 simpledb 是否可能会发生这样的事情。我正在尝试使用 以下类型的 simpledb 数据结构。

  1. 每个项目都有多个名称/值对(这里的名称是属性名称) 例如

    项目1
    序列号 -> 值
    项目2
    序列号 -> 值

  2. 这样数量的项目存在于一个域中,并且有多个这样的域。

我想查询类似:

select * from domain where attribute-name = 'serial number'

跨多个项目和域获取与一个序列号相关的所有项目; 这可能吗?

我的第二个问题是关于使用字段组合作为项目名称。
例如
在上述结构中,

Foo_datetime
            serial -> value

Foo1_datetime
            serial -> value

然后我会查询特定日期时间范围和特定 Foo 或 Foo1 之间的项目? 像

 select * from domain where itemname = 'Foo' and itemname > datetime and itemname < datetime.

【问题讨论】:

  • 我猜第一个问题的答案是“从域中选择序列号”

标签: amazon-simpledb


【解决方案1】:

对于您的第一个问题,您建议的查询将按照您的预期工作,无论您是“选择 *”还是“选择 serial_num”,它都可以工作。 SimpleDB 查询语言类似于 SQL。但是,没有办法让单个查询应用于多个域。每个查询都特定于单个域。要发出跨域查询,您必须向每个域发出查询。这会增加您的查询量,但是查询可以一次发送而无需等待,因此不会增加您等待响应的时间。

回答第二个问题,项目名称确实可以用来存储和查询数据。在这种情况下,您需要在查询中使用函数“itemName()”。修改最后一个示例的重写如下所示:

select * from domain where itemName() between 'Foodatetime1' and 'Foodatetime2'

其中日期时间 1 和 2 被替换为实际值。

【讨论】:

  • 谢谢莫基!那行得通!查找项目名称会比查找属性名称更快吗?
  • 如果您已经知道项目名称,则使用项目名称获取项目并调用 GetAttributes 通常是最快的方法。在 Select 操作的上下文中,在 where 子句中使用 itemName() 或属性名称的速度是相当的,并且取决于您的数据。
  • 感谢 Mocky 的快速回复。最后一个问题与我原来的第二个问题有关。我可以查询类似,从域中选择 *,其中 itemName() 介于 'datetime1' 和 '*datetime2' 之间——其中 '' 就像正则表达式通配符意味着什么?
  • 是的,你可以,但是你必须使用 LIKE 而不是 BETWEEN 并且通配符是 % 。但是,如果您将日期时间放在复合值的首位,BETWEEN 仍然很有用,因为比较是从左到右的,您可以省略尾随通配符 SELECT * FROM domain WHERE itemName() BETWEEN 'datetime1' AND 'datetime2'
【解决方案2】:

只是想在 Mocky 的回答中添加一点: SimpleDB 将日期存储/比较为字符串。所以要小心,避免像 2010-1-22 这样存储日期,并始终以符合 ISO 8601 的格式存储日期。

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多