将图像和结构化数据存储在一起(Google 云平台)

Storing images and structured data together (Google Cloud Platform)

我正在使用 Google Cloud Platform 构建云服务,但我还没有太多使用经验

除其他外,我的服务将存储具有名称、描述等属性的结构化实体。但是,我还希望每个实体以某种方式与可能包含数十个甚至数十个图像的集合相关联数百张图片。

查看存储选项 GCP 提供了我的数据的结构化性质,建议我应该使用 Datastore 并且图像 'unstructured' 应该使用常规存储(可能存储在文件夹中以将来自特定实体的图像保存在一起).

我的问题是 a) 对于我的用例,这是一种合理的方法吗?

如果是 b) 我如何 link 将这两个东西放在一起?

或者如果不是 b) 存储这些的最佳方法是什么?

您的数据存储区实体可能有一个 属性,其中包含图像文件名列表。假设你把每个图像放在一个代表实体ID/Name的"folder"中,你可以通过简单地调用(例如)显示图像:

"https://storage.googleapis.com/MY_BUCKET/" + entity.getId() + "/" + IMAGE_NAME;

在我的几个项目中,我需要存储有关每个图像的更多数据,例如它的顺序、方向和大小。在本例中,我创建了一个实体来表示 Datastore 中的每个图像。在某些情况下,我使用嵌入式实体 - 例如,产品实体包含表示与该产品相关的图像的嵌入式实体列表。这种方法允许我显示带有图像的产品列表,而无需额外查询来获取每个产品的图像。

我会使用两种不同的实体。前任。 AlbumImages 并使用类似文件结构的 ancestor path 来组织它们。然后我可以轻松地添加一个 Comment 实体种类作为 Images.

的子实体

2 个实体的示例 [TaskList:default, Task:sampleTask]

$taskKey = $datastore->key('TaskList', 'default')
    ->pathElement('Task', 'sampleTask');

阅读更多关于 Ancestor paths

我觉得你的方法不错,我也会这样做。

至于将数据存储结构化实体链接到图像,Andrei Volgin 建议的另一种更具可扩展性的方法是拥有多个映射实体 - 每个关联图像一个,包含属性:

  • 数据存储结构化实体的键(或键 ID)
  • 图像的存储name/location

这种方法的优点(尤其是当与一个结构化实体关联的图像数量很多时)是:

  • 无 1 write/sec 对同一结构化实体的 adding/deleting 个图像的限制

  • 尝试从多个同时请求中获取图像位置时,结构化实体本身没有争用

  • 随着与结构化实体关联的图像数量的增加(由于需要序列化的实体大小增加),性能不会下降;结构化实体的规模仍然很小

缺点是您需要额外的查询来获取有关与结构化实体关联的图像的信息。

如果最终需要,这些映射实体可以包含额外的结构化图像相关信息。