我应该使用ndb结构化属性还是单独的模型来限制我的GAE查询。基础数据建模问题。

时间:2013-05-01 21:51:02

标签: python google-app-engine database-design app-engine-ndb

我正在尝试重新格式化我之前以更有意义的方式提出的问题。如果我没有问正确的问题,或者没有提供足够的信息,请告诉我。

我有来自Pi的数据,该格式采用以下格式,我想要一种有意义的方式来表示数据存储区(ndb)中的数据,以限制我到达时的写入次数,并限制我需要的查询数量找到正确放置数据的地方(又名Zone):

数据如下:

  

{'rssi':'*','source_addr':' 87:ea:66:be:19:d9 ',   'id':'rx_io_data','samples':[{'adc-0':253,'adc-1':2},{' adc-0':   252,'adc-1':2 },{'adc-0':252,'adc-1':2},{'adc-0':253,'adc-1':   1},{'adc-0':252,'adc-1':2}],'选项':'\ x00'}

我突出了重要的信息(我不需要用于放入数据的代码。更适合我的模型的结构)..

所以我将使用MAC地址来找到与读数相关的“区域”,然后我将需要使用Zone来查找相关的传感器(似乎是复杂的),然后映射传感器(adc-0,adc- 1)它是人类可读的映射(温度或心脏监测器)。我想保留总读数和各个传感器读数,以便以后我可以查询所有区域或每个区域的所有心脏监测传感器......

到目前为止,我有这个似乎令人费解并且需要大量查询和放置的内容:

class Sensors(ndb.Model): # parent Zone
    sensorname = ndb.StringProperty(required=True) # Heart, Temp
    sensorpin = ndb.StringProperty(required=True) # adc-0, or adc-1 ... 

class Zone(ndb.Model):
    zname = ndb.StringProperty(required=True) # Name of zone like "Room# or Patient#"
    zonemac  = ndb.StringProperty(required=True) # MAC of network adapter
    homekey = ndb.KeyProperty(kind=Home, required=True)
    datecreated = ndb.DateTimeProperty(auto_now_add=True)

class Readings(ndb.Model): # parent Zone
    datecreated = ndb.DateTimeProperty(auto_now_add=True)
    alldata = ndb.JsonProperty(required=True) # store all the readings in json for later debug

class Reading(ndb.Model): # parent is Sensor or zone ? individual sensor readings ?
    readingskey =  ndb.KeyProperty(kind=Readings, required=True) # full reading
    value = ndb.IntegerProperty(required= True ) # or 0
    name = ndb.StringProperty(required = True) # Heart sensor, temp sensor,... )

潜在选项:

class Sensors(ndb.Model):
    sensorname = ndb.StringProperty(required=True) # Heart, Temp
    sensorpin = ndb.StringProperty(required=True) # adc-0, or adc-1 ... 

class Zone(ndb.Model):
    zname = ndb.StringProperty(required=True) # Name of zone like "Room# or Patient#"
    zonemac  = ndb.StringProperty(required=True) # MAC of network adapter
    homekey = ndb.KeyProperty(kind=Home, required=True)
    sensors = ndb.StructuredProperty(Sensors, repeated = True) #sensors you can get sensor name but how do you map to adc-0 or whatever
    datecreated = ndb.DateTimeProperty(auto_now_add=True)

class Readings(ndb.Model): # parent Zone
    datecreated = ndb.DateTimeProperty(auto_now_add=True)
    alldata = ndb.JsonProperty(required=True) # store all the readings in json for later debug
    individualreading = ndb.StructuredProperty(Reading, repeat=True)

class Reading(ndb.Model): # parent is Sensor or zone ? individual sensor readings ?
    readingskey =  ndb.KeyProperty(kind=Readings, required=True) # full reading
    value = ndb.IntegerProperty(required= True ) # or 0
    name = ndb.StringProperty(required = True) # Heart sensor, temp sensor,... )

技巧是我从设备获得的是MAC和传感器映射(ADC-0,ADC-1和值)

所以我需要寻找他们所属的区域,以及他们映射到的传感器以便以后搜索它们。

我做了很少的数据库建模,所以我不知道如何为此进行建模。我可以创建新模型并使用关键属性引用它们,或者创建结构化属性并查询(消除传感器模型),但仍然需要在lokups之后执行读数和读取。

非常感谢任何帮助。

是的,我已经阅读了ndb propertiesFiltering queries by structured properties以及一些类似的SO帖子,例如one.

1 个答案:

答案 0 :(得分:2)

我猜使用StructuredProperty可以节省少量的写入操作。我建议的是确定哪些属性不必索引,并使用indexed = False选项声明它们。正如documentation所述,“未编制索引的属性比索引属性花费更少。”根据经验,我可以告诉您,这样可以真正节省大量的写操作。