【问题标题】:How can I store arbitrary key value pairs in Azure table storage?如何在 Azure 表存储中存储任意键值对?
【发布时间】:2013-01-30 02:02:32
【问题描述】:

背景

我从客户端接收 CSV 数据文件,其中包含大量我不需要的数据和少量我需要的数据。将来我可能需要访问这些数据,虽然我正在归档原始数据文件,但我希望能更容易查询一些东西。我希望有一个解决方案,这并不意味着数据文件保持相同的格式 - 即客户端可以添加/删除列,我不希望我的实现因丢失数据而保释或无法存档其他数据。

当我在 Azure 中构建应用程序时,Azure 表存储对我来说是正确的 - 我可以读取数据文件,然后将读取的任何键/值对存储到数据存储中。

结果

我想知道如何在 Azure 中存储 Dictionary<K, V> 或 Hashtable 或其他一些键/值对。

【问题讨论】:

    标签: .net azure azure-table-storage


    【解决方案1】:

    通过覆盖派生自 TableEntity 的类的 ReadEntity 和 WriteEntity 方法,可以存储其他属性。

    这是我的幼稚实现

    public class TestEntity : TableEntity {
    
        public TestEntity(string a, string b) {
            PartitionKey = a;
            RowKey = b;
            DataItems = new Dictionary<string, string>();
        }
    
        public Dictionary<string, string> DataItems { get; set; }
    
        public override IDictionary<string, EntityProperty> WriteEntity(OperationContext operationContext) {
            var results = base.WriteEntity(operationContext);
            foreach (var item in DataItems) {
                results.Add("D_" + item.Key, new EntityProperty(item.Value));
            }
            return results;
        }
    
        public override void ReadEntity(IDictionary<string, EntityProperty> properties, OperationContext operationContext) {
            base.ReadEntity(properties, operationContext);
    
            DataItems = new Dictionary<string, string>();
    
            foreach (var item in properties) {
                if (item.Key.StartsWith("D_")) {
                    string realKey = item.Key.Substring(2);
                    ItemData[realKey] = item.Value.StringValue;
                }
            }
        }
    }
    

    我注意到,Azure 表存储总共只能存储 255 个键/值对,或者考虑到 PartitionKey 等因素后,只能存储 252 个自定义键/值对,因此这也必须在某个地方进行处理。

    【讨论】:

    • 我是blogged about this,欢迎任何人提供任何其他信息,或者如果您正在使用它,请只是备注!
    • 如果您只是使用二进制格式化程序(或 XML 格式化程序)序列化您的 Dictionary() 并将整个对象写入字节 [](或字符串)类型的单个实体属性,怎么样?我会改用这种方法。
    • 将它们保留为附加属性(理论上,未经测试)允许我使用TableQuery.GenerateFilterConditionFor* 来查询该数据(如果我突然需要使用它而不只是存档它,这可能很有用)。序列化,我想这会很棘手。虽然您确实回避了 252 个属性的限制,但您仍然需要担心会遇到每个属性 64kb 的限制(因此您必须对多个属性进行序列化)。
    • 如果我有大量已知很小的键/值对,我可能最终会使用该解决方案,但我的数据可能会倾向于我的(目前)。
    • true 用于 byte[] 限制,但仍然查询 PL&RK 以外的任何内容都会很慢。您看过 Lokad.Cloud 的胖实体了吗 - github.com/Lokad/lokad-cloud/wiki/FatEntities
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多