Google app engine 数据存储中的数据建模

Google app engine 数据存储中的数据建模,google-app-engine,go,Google App Engine,Go,我刚开始使用数据存储,所以有几件事我还不确定 我有休闲实体: 属性:{ID,number,name,long,lat} 地址:{name,postCodeType} 城市:{name} 国家:{name} 用户:{name,username} 因此,这背后的逻辑是用户将拥有多个属性,这意味着属性将持有用户密钥 如上所述,属性有一些属性,但我不确定如何关联地址城市和国家 我认为解决方案是将这3个实体的键存储在属性实体中 type Property struct { ID

我刚开始使用数据存储,所以有几件事我还不确定

我有休闲实体:

属性:
{ID,number,name,long,lat}

地址:
{name,postCodeType}

城市:
{name}

国家:
{name}

用户:
{name,username}

因此,这背后的逻辑是
用户
将拥有
多个属性
,这意味着
属性
将持有
用户密钥

如上所述,
属性
有一些属性,但我不确定如何关联
地址
城市
国家

我认为解决方案是将这3个实体的键存储在
属性实体中

type Property struct {   
  ID         int64   `json:"id" datastore:"-"`
  Number     int8    `json:"number"`
  Name       string  `json:"name"`
  Long       float64 `json:"long"`
  Lat        float64 `json:"lat"`
  AddressKey *datastore.Key
  CityKey    *datastore.Key
  CountryKey *datastore.Key
  UserKey    *datastore.Key
  CreatedAt  time.Time
}
我从上面的尝试是一个好的开始,还是我需要做些不同的事情

  • 国家列表很少更改,因此大多数程序员使用enum(或Goland等效项)来表示国家,而不是在数据存储中创建实体。您可以使用两个字母或三个字母的国家/地区代码,只需将国家/地区代码保存为地址实体中的字符串属性即可。枚举还可以基于国家代码返回国家的完整显示名称

  • 我也不认为有理由为城市创建一个实体,尽管这是可以做到的,如果真的有必要的话。通常,城市保存为字符串属性,必要时在地址实体中建立索引

  • 这意味着您的地址实体可能看起来像:

    Address: {name, street, city, country, postCode}
    
  • 进一步说,如果每个属性只有一个地址,您可能根本不需要地址实体。这就引出了一个非常简单的解决方案:

    type Property struct {   
      ID         int64   `json:"id" datastore:"-"`
      Number     int8    `json:"number"`
      Name       string  `json:"name"`
      Long       float64 `json:"long"`
      Lat        float64 `json:"lat"`
      Street     string  `json:"street"`
      City       string  `json:"city"`
      Country    string  `json:"country"`
      PostCode   string  `json:"postCode"`
      UserKey    *datastore.Key
      CreatedAt  time.Time
    }
    
  • 国家列表很少更改,因此大多数程序员使用enum(或Goland等效项)来表示国家,而不是在数据存储中创建实体。您可以使用两个字母或三个字母的国家/地区代码,只需将国家/地区代码保存为地址实体中的字符串属性即可。枚举还可以基于国家代码返回国家的完整显示名称

  • 我也不认为有理由为城市创建一个实体,尽管这是可以做到的,如果真的有必要的话。通常,城市保存为字符串属性,必要时在地址实体中建立索引

  • 这意味着您的地址实体可能看起来像:

    Address: {name, street, city, country, postCode}
    
  • 进一步说,如果每个属性只有一个地址,您可能根本不需要地址实体。这就引出了一个非常简单的解决方案:

    type Property struct {   
      ID         int64   `json:"id" datastore:"-"`
      Number     int8    `json:"number"`
      Name       string  `json:"name"`
      Long       float64 `json:"long"`
      Lat        float64 `json:"lat"`
      Street     string  `json:"street"`
      City       string  `json:"city"`
      Country    string  `json:"country"`
      PostCode   string  `json:"postCode"`
      UserKey    *datastore.Key
      CreatedAt  time.Time
    }
    
  • 国家列表很少更改,因此大多数程序员使用enum(或Goland等效项)来表示国家,而不是在数据存储中创建实体。您可以使用两个字母或三个字母的国家/地区代码,只需将国家/地区代码保存为地址实体中的字符串属性即可。枚举还可以基于国家代码返回国家的完整显示名称

  • 我也不认为有理由为城市创建一个实体,尽管这是可以做到的,如果真的有必要的话。通常,城市保存为字符串属性,必要时在地址实体中建立索引

  • 这意味着您的地址实体可能看起来像:

    Address: {name, street, city, country, postCode}
    
  • 进一步说,如果每个属性只有一个地址,您可能根本不需要地址实体。这就引出了一个非常简单的解决方案:

    type Property struct {   
      ID         int64   `json:"id" datastore:"-"`
      Number     int8    `json:"number"`
      Name       string  `json:"name"`
      Long       float64 `json:"long"`
      Lat        float64 `json:"lat"`
      Street     string  `json:"street"`
      City       string  `json:"city"`
      Country    string  `json:"country"`
      PostCode   string  `json:"postCode"`
      UserKey    *datastore.Key
      CreatedAt  time.Time
    }
    
  • 国家列表很少更改,因此大多数程序员使用enum(或Goland等效项)来表示国家,而不是在数据存储中创建实体。您可以使用两个字母或三个字母的国家/地区代码,只需将国家/地区代码保存为地址实体中的字符串属性即可。枚举还可以基于国家代码返回国家的完整显示名称

  • 我也不认为有理由为城市创建一个实体,尽管这是可以做到的,如果真的有必要的话。通常,城市保存为字符串属性,必要时在地址实体中建立索引

  • 这意味着您的地址实体可能看起来像:

    Address: {name, street, city, country, postCode}
    
  • 进一步说,如果每个属性只有一个地址,您可能根本不需要地址实体。这就引出了一个非常简单的解决方案:

    type Property struct {   
      ID         int64   `json:"id" datastore:"-"`
      Number     int8    `json:"number"`
      Name       string  `json:"name"`
      Long       float64 `json:"long"`
      Lat        float64 `json:"lat"`
      Street     string  `json:"street"`
      City       string  `json:"city"`
      Country    string  `json:"country"`
      PostCode   string  `json:"postCode"`
      UserKey    *datastore.Key
      CreatedAt  time.Time
    }