0

我正在使用 Google App Engine 和 Big Table。

我有一个person看起来像这样的实体:

{
    // This property would be encoded into JSON and saved un-indexed as db.Text()
    phone_numbers:
    {
        'hHklams8akjJkaJSL': // <-- Should I key this object?
        {
            number:'555-555-5555',
            type:'mobile', 
        },
        etc...
    },
    // This property is an array of strings.  
    // It is searchable so that a query could be run to find all 
    //   people with a particular phone number: 
    //   "SELECT * FROM person WHERE phone_number_search_property =      
    //     '5555555555'"
    phone_number_search_property:['5555555555','other phone numbers...'],

    first_name:'...',
    etc...
}

phone_number属性存储为 JSON 格式 (db.Text) 的未索引文本块。如果我想在这种情况下引用特定的电话号码,我会解码 json,然后使用我正在寻找的特定密钥获取电话号码。

phone_number_search_property用于搜索。它可以通过电话号码进行搜索:"SELECT * FROM person WHERE phone_number_search_property = '5555555555'"

在这种情况下,引用实体内部电话号码的好方法是什么?在这里,我使用 UUID 键入每个值。这是一种“正常”且被接受的做事方式吗?如果不是,那是什么?

谢谢!

4

1 回答 1

1
  1. 如果数据对象实际上只是另一个对象的一部分,并且在没有“父”对象的情况下永远不会被访问(例如电话号码和人员的情况),那么恕我直言,可以将其序列化并将其存储在“父”对象中。所以你做的没问题。

  2. 您通过电话号码搜索人员,因此具有(标准化)电话号码的附加属性的解决方案正在工作。如果您需要搜索其他属性,那么它将不起作用(例如,将搜索限制为仅移动电话号码)。

  3. 为什么要通过散列字符串键入序列化的电话号码(我假设您通过 生成它UUID.fromString(String))?只需使用(标准化)电话号码 - 它是唯一的。

于 2012-03-12T07:16:39.433 回答