💾 MarineMathDesktop - Veritabanı Mimarisi¶
🗃️ 1. Veritabanı Dosyası¶
Dosya Adı: your_database.db
- Format: SQLite3 (.db uzantılı)
- Konum: Uygulama ana dizini
with sqlite3.connect("your_database.db") as conn:
📊 2. Tablo Sayısı ve İsimleri¶
Toplam 3 Tablo:
Tablo Adı | Hesaplama Türü | Sütun Sayısı |
---|---|---|
table1 |
Beton İskele Hesaplamaları | 19 sütun |
table2 |
Metal İskele Hesaplamaları | 20 sütun |
table3 |
Tork Denge Hesaplamaları | 7 sütun |
🏗️ 3. Tablo Yapıları¶
📋 Table1 (Beton İskele) - 19 Sütun¶
CREATE TABLE IF NOT EXISTS table1 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
length REAL,
height REAL,
width REAL,
eps_length REAL,
eps_width REAL,
eps_height REAL,
is_colon INTEGER,
is_bottom_closed INTEGER,
colon_count INTEGER,
vertical_colon INTEGER,
vertical_colon_count INTEGER,
plus_weight REAL,
total_weight REAL,
freeboard REAL,
bend_bar_weight REAL,
straight_bars_weight REAL,
concrete_volume REAL,
wicker_area REAL
)
Örnek Sütunlar:
- length REAL
- İskele uzunluğu (metre)
- is_colon INTEGER
- Kolon varlığı (Boolean → 0/1)
- total_weight REAL
- Toplam ağırlık (kg)
- freeboard REAL
- Freeboard mesafesi (metre)
⚙️ Table2 (Metal İskele) - 20 Sütun¶
CREATE TABLE IF NOT EXISTS table2 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
iskele_uzunluk REAL,
iskele_genislik REAL,
iskele_yukseklik REAL,
steel_profile_length REAL,
steel_profile_length_2 REAL,
sandik_sayisi INTEGER,
sandik_uzunluk REAL,
sandik_genislik REAL,
sandik_yukseklik REAL,
ek_agirlik REAL,
profil_secimi TEXT,
profil_secimi_2 TEXT,
u_profil_secimi TEXT,
sac_levha_secimi TEXT,
freeboard REAL,
weight REAL,
deck_count INTEGER,
npu_length REAL,
sac_m2 REAL
)
Örnek Sütunlar:
- profil_secimi TEXT
- Çelik profil seçimi (örn: "30x50x2.00 mm")
- sandik_sayisi INTEGER
- Sandık adedi
- ek_agirlik REAL
- Ek ağırlık (kg)
- sac_m2 REAL
- Sac levha alanı (m²)
⚖️ Table3 (Tork Denge) - 7 Sütun¶
CREATE TABLE IF NOT EXISTS table3 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
left_weights REAL,
left_distances REAL,
right_weights REAL,
right_distances REAL,
unknown_distance REAL,
unknown_weight REAL
)
Örnek Sütunlar:
- left_weights REAL
- Sol ağırlıklar (CSV format: "100,200,150")
- right_distances REAL
- Sağ mesafeler (CSV format: "1.5,3.5")
- unknown_weight REAL
- Bilinmeyen ağırlık (kg)
- unknown_distance REAL
- Bilinmeyen mesafe (metre)
🔢 4. Veri Tipleri ve Formatlar¶
SQLite Tipi | Python Karşılığı | Kullanım Alanı | Örnek Değer |
---|---|---|---|
INTEGER |
int |
ID, sayılar, boolean | 1 , 5 , 0/1 |
REAL |
float |
Ölçüler, ağırlıklar | 5.25 , 1247.83 |
TEXT |
str |
Profil seçimleri, CSV | "NPU 100" , "100,200" |
Boolean Handling:
# Boolean değerler INTEGER olarak saklanır
is_colon INTEGER, # 0 = False, 1 = True
is_bottom_closed INTEGER, # 0 = False, 1 = True
vertical_colon INTEGER, # 0 = False, 1 = True
CSV Format (Table3):
# Liste verileri virgülle ayrılmış string olarak saklanır
data = (
','.join(map(str, balance_data[1])), # "100,200,150"
','.join(map(str, balance_data[2])), # "2,3,4"
# ...
)
💾 5. Kayıt Yöntemi¶
Otomatik Kayıt Sistemi:
-
✅ Hesaplama sonrası anında kayıt
-
✅ Her hesap modülünde
create_tables()
çağrılır -
✅ Birincil anahtar: AUTO_INCREMENT ID (her tabloda)
-
❌ Manuel kayıt butonu YOK
Kayıt Akışı:
def hesaplamafonk():
# 1. Hesaplama yap
freeboard, weight = calculate_freeboard(...)
# 2. Tabloları oluştur (ilk çalışma için)
create_tables()
# 3. Anında kaydet
save_calculation_metal([None, uzunluk, genislik, ...])
Primary Key Yapısı:
id INTEGER PRIMARY KEY AUTOINCREMENT
🔄 6. CRUD Desteği¶
İşlem | Durum | Fonksiyon | Kullanım Yeri |
---|---|---|---|
CREATE | ✅ Tam | save_calculation_*() |
Her hesaplama sonrası |
READ | ✅ Tam | get_all_calculations_*() |
Geçmiş sayfası |
UPDATE | ❌ Yok | - | Desteklenmiyor |
DELETE | ✅ Kısmi | confirm_and_delete() |
Geçmiş sayfasında |
Read Operasyonları:
# Tüm kayıtları çek
get_all_calculations_concrete() -> List[Tuple]
get_all_calculations_metal() -> List[Tuple]
get_all_calculations_balance() -> List[Tuple]
# ID ile tekil kayıt
get_calculation_by_id(calc_id: int, table_name: str) -> Optional[Tuple]
Delete Operasyonu:
def confirm_and_delete(table_name):
# MessageBox ile onay al
# SQL DELETE çalıştır
# Listeyi yenile
UPDATE İşlemi: - ❌ Desteklenmiyor - ❌ Düzenleme özelliği yok - ✅ Read-only detail view (salt okunur detay görünümü)
🚀 7. Veritabanı Başlatma¶
Schema Oluşturma:
- ✅ Runtime'da oluşturulur (önceden değil)
- ✅ Her modül çağrısında create_tables()
- ✅ CREATE TABLE IF NOT EXISTS
pattern'i kullanır
- ✅ İlk çalıştırmada otomatik setup
Başlatma Noktaları:
# Her hesaplama modülünde
create_tables() # Tabloları kontrol et/oluştur
save_calculation_*() # Veriyi kaydet
# Geçmiş sayfasında
create_tables() # Sayfa açılışında
Timing:
-
Uygulama başlatıldığında: Veritabanı yoksa oluşturulur
-
Her hesaplama öncesi:
create_tables()
çağrısı -
Her modül geçişinde: Tablo varlığı garantisi
Error Handling:
try:
cursor.execute("INSERT INTO...", calculation[1:])
except sqlite3.Error as e:
print(f"Error saving calculation: {e}")
Dosya Yönetimi:
-
✅ Context manager:
with sqlite3.connect()
-
✅ Otomatik connection close
-
✅ Thread-safe operasyonlar
-
✅ Minimal locking (SQLite default)
Not
Bu veritabanı mimarisi basitlik, güvenilirlik ve performans dengesi kurarak uygulamanın veri ihtiyaçlarını etkin şekilde karşılar.