When I work with image data, I keep the original image separate from thumbnails, labels, embeddings, and moderation output. I recommend making each derived artifact traceable back to the source image and model version.
Visual evidence with context
Image data becomes operational only when the picture is connected to ownership, labels, and review state.
How photos become reviewable evidence
Image data becomes operational only when the picture is connected to ownership, labels, and review state.
Storage patterns I would expect
The useful question is whether the data has a known owner, a known freshness window, and a safe consumer path.
S3 or Blob or Cloud Storage, PostgreSQL, DynamoDB, MongoDB, OpenSearch, Elasticsearch, vector databases, data lake tables for analytics.
Useful cloud services
| Provider | Typical services |
|---|---|
| AWS | S3, Lambda, Rekognition, SageMaker, OpenSearch, Athena. |
| Azure | Blob Storage, Azure AI Vision, Functions, AI Search, Synapse. |
| Google Cloud | Cloud Storage, Cloud Vision, Dataflow, Vertex AI, BigQuery. |
Public example worth knowing
The example is intentionally practical because production systems expose tradeoffs faster than terminology does.
Facebook Haystack is the classic public example: Facebook described a storage system designed for billions of photos where object storage, metadata, and retrieval efficiency mattered more than ordinary file system thinking.
A business example
This keeps the discussion close to the place where engineers actually make the decision.
An insurance claim app uploads photos. The pipeline keeps the original image, creates a review thumbnail, extracts EXIF time and location when allowed, runs damage detection, and indexes claim id, vehicle id, and detected damage type.
Operational code example
The code example should make the operational rule visible.
ClaimRoute routeImage(ImageAsset image) {
if (!image.consentRecorded()) return ClaimRoute.PRIVACY_HOLD;
if (image.moderationScore() > 0.80) return ClaimRoute.MANUAL_REVIEW;
if (image.labelConfidence("damage") < 0.85) return ClaimRoute.NEED_BETTER_PHOTO;
return ClaimRoute.AUTO_ESTIMATE;
}
The routing logic blocks privacy risk first, sends unsafe or uncertain images to review, and only allows automation when the damage label is confident enough.
What I would check first
- Do not put images directly in relational rows.
- Store rights, consent, and retention with the object metadata.
- Separate human review metadata from model generated labels.