在Azure SQL数据库中存储所需的Azure存储表关系是否正确?例如,我可能有一个系统跟踪他们拥有的用户和书籍。我会在Azure存储表中保留用户实体和书籍实体,并在支持Azure SQL表格中保持关系(idUser,idBook)。
这是一个好方法吗?这个解决方案的缺点是什么?
修改: 这样做的动机只是降低成本。我需要存储大量数据,所以我打算使用Azure存储表,因为SQL数据库将简单到昂贵。但在某些情况下,我需要存储对象之间的关系。
答案 0 :(得分:4)
我可能会遗漏一些东西,但坦率地说,我看不出有这么好的理由。
使用关系数据库的一个主要原因是存储关系数据,维护参照完整性,并依赖查询优化器来进行有效的连接。但是,由于您没有将相关用户或书籍数据存储在同一数据库中,因此无法在表中创建外键约束,也不能跨表连接数据,因为它不存在。事实上它更糟糕,因为首先你必须从SQL数据库中获取数据,然后你必须去表存储来获取其余的数据,所以你要连接到两个不同的服务只是为了检索一个列表数据
答案 1 :(得分:3)
我想在@ Click-Rex的回答中添加一些内容:
high density SQL server hosting
,因此您可能会受到noisy neighbor
行为的影响。表存储有点安全,因为隔离边界首先是您的存储帐户,然后是表,然后是PartitionKey。@ Click-Rex提出的方法是我想要的方法,我想再做一件事:
在其他表中, duplicate the books and user information as well and not just BookId and UserId
。这样你只需要从一个表中读取而不是进行多次读取。这种方法的缺点是,您必须确保每当书籍信息或用户信息发生变化时,您都需要更新这些表格,但优点是您可以在阅读操作上节省很多。例如,假设您要查找用户拥有的书籍。如果您不将书籍信息存储在此辅助表格中,首先您将从此辅助表格中获取所有行键(书籍ID),然后对于每个书籍ID,您将从书籍表格中获取有关该书籍的信息。假设用户有500本书,则表示您正在执行500 + 1个读取事务。但是,如果您将书籍信息存储在辅助表本身中,那么您只需执行1次读取操作。
显然,如果 application is performing more reads than writes
,这种方法会有意义。您需要记住的另一件事是,您将无法获得事务支持,因为您将在许多表和分区中进行编写,因此您需要确保实体无论如何都会持久化。在我正在构建的应用程序中,我们正在遵循这种方法,我们实际上有一个工作者角色负责确保数据被持久化。
答案 2 :(得分:1)
我听说有用户使用Azure Table Storage来存储关系;例如:
UserID
)BookID
)UserID
,RowKey:BookID
)BookID
,RowKey:UserID
) UserBooks
和BookUsers
就像一个明确定义的索引;并允许您执行更快的搜索,因为PartitionKey和RowKey是您将用于关联的字段。
然而,明显的缺点是必须在数据旁边保留2个额外的表格。
真的可以归结为使用表存储而不是SQL Azure的性能下降(并且会严重下降)是否值得节省成本。