Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 如何正确存储与Microsoft Azure表存储的数据关系?_Design Patterns_Database Design_Azure - Fatal编程技术网

Design patterns 如何正确存储与Microsoft Azure表存储的数据关系?

Design patterns 如何正确存储与Microsoft Azure表存储的数据关系?,design-patterns,database-design,azure,Design Patterns,Database Design,Azure,来自关系世界,Azure表存储的情况显然非常不同。我遇到的第一件大事是如何正确地存储多对多关系 例如,我可能有一个跟踪用户和他们拥有的书籍的系统。我在这里找到了另一篇文章,建议在用户上有一个String属性,它基本上存储了用户拥有的图书ID列表。虽然我知道有时这是一种公认的数据存储方式,但问题是Azure只允许您以字符串形式存储64KB的数据。这无疑限制了用户可能拥有的图书数量 另一种可能的解决方案是使用重复数据。我可能有一个存储系统中所有已知书籍的表。但是当用户需要与一本书关联时,我会将书数据

来自关系世界,Azure表存储的情况显然非常不同。我遇到的第一件大事是如何正确地存储多对多关系

例如,我可能有一个跟踪用户和他们拥有的书籍的系统。我在这里找到了另一篇文章,建议在用户上有一个String属性,它基本上存储了用户拥有的图书ID列表。虽然我知道有时这是一种公认的数据存储方式,但问题是Azure只允许您以字符串形式存储64KB的数据。这无疑限制了用户可能拥有的图书数量

另一种可能的解决方案是使用重复数据。我可能有一个存储系统中所有已知书籍的表。但是当用户需要与一本书关联时,我会将书数据复制到另一个名为OwnedBooks的表中,该表本质上与书表完全相同,只是它也有OwnedByUserID属性

还有其他可能的解决办法吗


除了这个问题,还有人对使用Azure表存储时的其他模式和实践有什么好的建议吗?

你没有。在Azure表上有一个很好的CompreHnive(.docx链接),其中有一个关于最佳实践的部分。但是,对于非关系属性包或ORM类型设计,应该使用表。如果您希望在云中使用关系数据库,那么应该使用


下面是另一个关于无模式存储与关系存储的比较。这是针对a的,但概念是相同的。

有很多解决方案,当然都有缺点:-)

  • 像在RDBMS中一样,使用一个简单的映射表。每行将包含一个Book键和一个User键

    然后,要查找用户的所有图书,您需要在映射表中选择图书键,然后从图书表中为每个键选择图书实体。您可以使用异步抓取并行执行图书检索,但即使如此,此解决方案显然无法扩展

  • 使用如上所述的映射表,但也要在映射表中包含所需的所有书籍数据。这是您已经在OwnedBooks表中提出的非规范化或“重复数据”解决方案

    这种方法的主要缺点是,如果您需要更新任何书籍数据,您可能会更新许多实体-并且由于它们位于书籍本身的单独表中,因此无法在单个事务/批处理中完成(我想您无论如何都会使用用户标识作为映射表中的分区键,这已经排除了该表中的单个批处理更新)

  • 将加入用户单个属性的图书密钥存储。同样,您已经建议使用此方法

    如果不是因为Azure目前不支持“contains”,这实际上不会太糟糕键入查询-也就是说,你不能在子字符串上搜索,因此如果你想找出哪些用户拥有某本书,这是不可能的。有趣的是,Google App Engine在他们的存储系统中相当透明地支持这一点,并将为你索引该列表。无论如何,你仍然需要使用此子字符串检索每本书的数据方法也是

  • 使用Azure表存储的“无模式”特性将关联的图书密钥存储为单个属性。例如,一个用户实体可能如下所示:

    {
    名称:“User1”,
    第4325卷:对,
    第5123卷:真的
    }

    另一个可能是这样的:

    {
    名称:“User2”,
    第5346卷:对,
    第8753卷:对,
    第6135卷:对
    }

    然后,如果您确实希望找到拥有特定书籍的所有用户,您可以选择该特定属性为真的位置(好吧,它只需要真的存在)

    这种方法的明显缺点是它有点脆弱,你需要在属性名中修改键,并且你无法使用StorageClient的标准方法来实现这一点-你必须自己滚动。此外,Azure在一个实体上只支持255个属性。尽管如此,我认为它可以很好地扩展-尽管我从来没有这样做过试过了

  • 在所有这些选项中,我认为您将使用的选项2是最好的,因为它目前受Azure支持,并且您通常可以通过较少的查询实现所有功能

    考虑到原子事务是不存在的,您只需要仔细检查您的用例,以决定数据更新的方式和时间。我几乎可以保证您能够接受“最终一致”的情况,并且只考虑到您的映射表可能并非总是100%最新的事实


    如果在主表的同时更新映射表中的数据的成本太高,您可以将一条消息放在队列中,并让一个工作角色为您异步执行更新。

    我不一定要在云中使用Realational。我想了解人们如何将这些keystore/bag数据库与我提供了一个简单的例子。我无法想象任何需要数据之间关系的项目不能/不应该用于此数据库或类似数据库。+1用于Azure Table白皮书。有点离题,但在阅读此答案后,我在internet上进行了快速搜索,找到了所有Azure相关白皮书的url,这可能会导致ove在不同的环境下非常有用:选择选项2似乎相当便宜,尽管它有缺点。因为每100000个事务只需花费0.01美元。每个事务都是对存储权限的一个查询?因此更改书名只会产生一个查询,然后在表中更新找到的每个实体。但这取决于ds ofc取决于您正在更新的数据量。但是,如果更新量很少,那么就可以了。不是吗?