notebookVb
This commit is contained in:
@@ -216,84 +216,13 @@ with Image.open(path) as img:
|
||||
|
||||
---
|
||||
|
||||
## 7. Návrh databázového schématu (draft)
|
||||
## 7. Databázové schéma
|
||||
|
||||
```sql
|
||||
CREATE TABLE photos (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
|
||||
-- identita (3 úrovně)
|
||||
sha256_file CHAR(64) UNIQUE NOT NULL, -- byte identita
|
||||
sha256_pixels CHAR(64), -- pixel identita
|
||||
phash BIGINT, -- vizuální podobnost
|
||||
|
||||
-- soubor
|
||||
file_path VARCHAR(1000) NOT NULL,
|
||||
file_name VARCHAR(255) NOT NULL,
|
||||
file_size BIGINT,
|
||||
mime_type VARCHAR(50),
|
||||
format VARCHAR(20), -- JPEG, PNG, HEIC, ...
|
||||
width INT,
|
||||
height INT,
|
||||
|
||||
-- pořízení
|
||||
taken_at TIMESTAMPTZ, -- s timezone (máme OffsetTime!)
|
||||
taken_at_source VARCHAR(20), -- 'exif' / 'mtime' / 'iptc' / 'unknown'
|
||||
|
||||
-- technika (z EXIF)
|
||||
camera_make VARCHAR(100),
|
||||
camera_model VARCHAR(255),
|
||||
lens_model VARCHAR(255),
|
||||
iso INT,
|
||||
aperture NUMERIC(4,2),
|
||||
exposure_time VARCHAR(20), -- "1/500"
|
||||
focal_length_mm NUMERIC(5,2),
|
||||
|
||||
-- GPS (NULL pokud chybí)
|
||||
gps_lat NUMERIC(10,7),
|
||||
gps_lon NUMERIC(10,7),
|
||||
gps_altitude NUMERIC(7,2),
|
||||
|
||||
-- klasifikace
|
||||
is_screenshot BOOLEAN DEFAULT FALSE,
|
||||
face_count INT, -- z XMP, rozšířit AI
|
||||
|
||||
-- flexibilní JSONB pro celý dump
|
||||
exif_raw JSONB,
|
||||
iptc_raw JSONB,
|
||||
xmp_raw JSONB,
|
||||
|
||||
-- import / zpracování
|
||||
imported_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
processed_at TIMESTAMPTZ,
|
||||
processing_status VARCHAR(50) DEFAULT 'pending'
|
||||
);
|
||||
|
||||
CREATE INDEX idx_photos_sha256_pixels ON photos(sha256_pixels);
|
||||
CREATE INDEX idx_photos_phash ON photos(phash);
|
||||
CREATE INDEX idx_photos_taken_at ON photos(taken_at);
|
||||
CREATE INDEX idx_photos_camera_model ON photos(camera_model);
|
||||
CREATE INDEX idx_photos_exif_gin ON photos USING GIN (exif_raw);
|
||||
|
||||
CREATE TABLE tags (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
parent_tag_id INT REFERENCES tags(id), -- hierarchie "místo > Praha > Karlův most"
|
||||
UNIQUE(name, parent_tag_id)
|
||||
);
|
||||
|
||||
CREATE TABLE photo_tags (
|
||||
photo_id BIGINT REFERENCES photos(id) ON DELETE CASCADE,
|
||||
tag_id INT REFERENCES tags(id) ON DELETE CASCADE,
|
||||
source VARCHAR(20), -- 'manual' / 'iptc' / 'xmp' / 'auto'
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
PRIMARY KEY (photo_id, tag_id)
|
||||
);
|
||||
```
|
||||
Kompletní aktuální schéma (tabulky, sloupce, indexy) viz **[SCHEMA.md](SCHEMA.md)**.
|
||||
|
||||
---
|
||||
|
||||
## 8. Otevřené otázky pro příště
|
||||
## 8. Otevřené otázky
|
||||
|
||||
### Foto bez EXIF (sirotek typu [7])
|
||||
|
||||
@@ -326,52 +255,6 @@ CREATE TABLE photo_tags (
|
||||
|
||||
---
|
||||
|
||||
## 10. Aktuální stav projektu (k 2026-05-21)
|
||||
## 10. Aktuální stav a struktura projektu
|
||||
|
||||
### Soubory v projektu
|
||||
|
||||
```
|
||||
FotkyBuzalkovi/
|
||||
├── demo_fotky/ # 7 ukázkových fotek
|
||||
├── explore_photos.py # Explorační skript (hashe, EXIF, IPTC, XMP)
|
||||
├── photo_exploration.json # Výstup exploreru
|
||||
├── create_schema.py # ZASTARALÉ - obsahuje MySQL syntaxi a hardcoded hesla
|
||||
├── test_db_connection.py # Test PG + Mongo + Redis (Mongo/Redis nebudou potřeba)
|
||||
├── test_mongo.py # ZASTARALÉ - Mongo nepoužijeme
|
||||
├── README.md
|
||||
└── NAVRH.md # Tento dokument
|
||||
```
|
||||
|
||||
### Co bude potřeba udělat
|
||||
|
||||
- [ ] Smazat nebo přepsat `create_schema.py` (MySQL syntaxe `INDEX` uvnitř `CREATE TABLE` v PG nefunguje)
|
||||
- [ ] Migrovat hesla do `.env` + `python-dotenv`
|
||||
- [ ] Smazat / archivovat `test_mongo.py`
|
||||
- [ ] Vytvořit migraci podle schématu v sekci 7
|
||||
- [ ] Skript pro import fotek s deduplikací (workflow v sekci 4)
|
||||
- [ ] Rozhodnout otevřené otázky ze sekce 8
|
||||
|
||||
### Nainstalované Python balíčky
|
||||
|
||||
```
|
||||
psycopg2-binary 2.9.12 # PostgreSQL driver
|
||||
pymongo 4.17.0 # (nepotřebujeme)
|
||||
redis 7.4.0 # (zatím nepotřebujeme)
|
||||
pillow 12.2.0 # Základní práce s obrázky
|
||||
ExifRead 3.5.1 # Primární EXIF parser (lepší než Pillow)
|
||||
imagehash 4.3.2 # Perceptuální hashe (pHash, dHash, wHash)
|
||||
+ numpy, scipy, PyWavelets (závislosti imagehash)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. Užitečné odkazy
|
||||
|
||||
- [Pillow](https://pillow.readthedocs.io/) — Python Imaging Library
|
||||
- [ExifRead](https://github.com/ianare/exif-py) — EXIF parser
|
||||
- [imagehash](https://github.com/JohannesBuchner/imagehash) — perceptuální hashe
|
||||
- [exiftool](https://exiftool.org/) — gold standard pro metadata (Perl, ale `pyexiftool` wrapper)
|
||||
- [pgvector](https://github.com/pgvector/pgvector) — vektory v PostgreSQL pro sémantické hledání
|
||||
- [PostgreSQL JSONB docs](https://www.postgresql.org/docs/current/datatype-json.html)
|
||||
- [IPTC Photo Metadata Standard](https://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata)
|
||||
- [XMP Specification (Adobe)](https://www.adobe.com/devnet/xmp.html)
|
||||
Viz **[README.md](README.md)** — hlavní rozcestník projektu.
|
||||
|
||||
Reference in New Issue
Block a user