在Azure表存储中存储子对象的首选方法

时间:2012-02-09 20:08:59

标签: azure azure-table-storage

我今天在azure表存储中存储子对象时做了一点点过期。 类似Person.Project的东西,其中Person是表实体,Person只是POCO。我能够实现这一目标的唯一方法是将Project序列化为byte []。它可能是需要的,但还有另一种方法吗?

由于 拉斯穆斯

4 个答案:

答案 0 :(得分:1)

我个人更喜欢将项目存储在一个不同的表中,该表具有与其父项相同的分区键,即其Person的分区键。它确保人员和基础项目将存储在同一存储群集中。在代码方面,我想在引用属性之上有一些属性,例如[Reference(typeof(Person))]和[Collection(typeof(Project))],在数据上下文类中我可以使用一些扩展方法,它根据需要检索子元素。

答案 1 :(得分:0)

我认为当你说人只是一个POCO时,你的意思是Project只是一个POCO?

我首选的方法是将子对象存储在自己的Azure表中,并使用与父对象相同的分区键和行键。主要原因是,如果必须,这允许您对此子对象运行查询。您不能只运行一个使用父和子属性的查询,但至少可以对子实体运行查询。另一个优点是,这意味着子类可以占用更多空间,您可以在单个属性中存储的数据量的限制小于您可以连续存储的数量。

如果这些事情都不是你的问题,那么你所做的事情是完全可以接受的。

答案 2 :(得分:0)

就原始问题而言,您当然可以将父母和子女同时存储在同一个表中 - 您是否在尝试时看到错误?

通过将父级和子级分离到单独的表中而牺牲的另一个方面是将更新分组到事务中的能力。假设您创建了一个新的“人”并为该人添加了许多项目,如果它们位于具有相同分区键的同一个表中,则可以将多个插入作为一个原子操作发送。使用多表方法,您将不得不自己管理原子性(如果这是数据一致性模型的要求)。

答案 3 :(得分:0)

我遇到了类似的问题并实现了一个通用对象flattener / recomposer API,它将复杂的实体展平为扁平EntityProperty词典,并以{{1}的形式将它们写入表存储}。

然后,相同的API将从DynamicTableEntity的{​​{1}}字典重新组合整个复杂对象。

查看:https://www.nuget.org/packages/ObjectFlattenerRecomposer/

<强>用法:

EntityProperty