刚开始研究Azure框架。
只需说您在表存储中创建一行。
然后在 Blob 存储中创建一个 Bob,
有什么方法可以将刚刚添加到表中的内容与刚刚创建的 Blob 关联起来?
或者任何时候您有相关条目都必须使用 SQL Azure?
假设您想将一些视频存储在一个 blob 中,但在 SQL Azure 表中有一些您想链接到该 Blob 的行,这将是令人失望的。
由于您无法获得此链接,您必须以某种方式将视频存储在 SQL Azure 中吗?
您可以将存储在 blob 中的文件的唯一文件名存储到 azure 表行中。不建议在 Azure 表或 SQL azure 表中存储完整的视频/二进制内容,因为与 blob 相比,检索会变得有点慢,而且 SQL azure 有点贵。
只要您仔细选择您的 blob 文件名,您就应该能够在您的 Azure 表中引用该文件名。但是,请注意如何命名它。使用基于时间戳的名称并在表中引用它是非常诱人的。但是,使用 Azure,您显然是在使用最终可以高度并行的可扩展解决方案。
为文件名使用 GUID 以保证唯一性。或者,如果您希望能够根据添加项目的时间更轻松地浏览存储,则可以选择带有 GUID 后缀的日期格式 YYYYMMDDHHMMSS。
这是完全可能的,并且做了很多次,我亲自为我从事的一个项目实现了这样的架构。
对于写入表的实体,我使用 Blob 名称作为分区键和 Blob 容器名称作为行键。
您也可以采用其他方式,选择 Blob Container Name 作为 PK,Blob Name 作为 RK。然后,您可能需要考虑表中的分区不会变得太大,并且如果您的 blob 容器太拥挤,则会导致一些性能问题。
但是,您需要明确处理一件事,Blob Name 和 Blob Container Name 具有不同的命名约束,然后是 Table Partition Keys 和 Table Row 键,因此您需要清理 Blob Name 和 Blob Container Name,然后再将它们用作 PK和 RK 并将实体写入表或从表中读取实体。
以下是如何清理 Blob Name 和 Blob Container Name 以用作表键的方法:
public static readonly Regex DisallowedCharsInTableKeys = new Regex(@"[\#%/?\u0000-\u001F\u007F-\u009F]");
string sanitizedKey = DisallowedCharsInTableKeys.Replace(BlobName, disallowedCharReplacement);
在此阶段,您可能还希望在已清理的键(分区键或行键)前加上原始键的哈希(即 Blob 名称),以避免具有相同已清理值的不同无效键的错误冲突。
Azure 支持将元数据与 blob 相关联。元数据本质上只是名称-值对。以下视频可能有用:http ://www.bestechvideos.com/2009/04/15/mix09-windows-azure-storage
因此,您可能希望通过使用元数据来做相反的事情,而不是将表与 blob 相关联。